2011-08-31 88 views
0

我弄明白了,我無法釋放我在其他類的appDelegate中設置的變量。我有一個類myClass無法釋放我的appDelegate變量

In myClass.m if I do : 

    appDelegate = [[UIApplication sharedApplication] delegate]; 

    appDelegate.aString = [[NSString alloc] init]; //aString is declared and synthesized in appDelegate class. 
    [appDelegate.aString stringWithString:@"test"]; 
    [appDelegate.aString release]; 

    NSLog(appDelegate.aString); 

我在控制檯中得到「測試」。

我做錯了什麼? :/

+0

當你輸入'[appDelegate.aString stringWithString:@「test」];'? – Nekto

+0

其實我想從其他類訪問aString。就像一個全局變量。當我輸入這個時,我的意思是設置我的appDelegate的aString變量。 – ShiniFox

+0

然後你應該這樣寫:'appDelegate.aString = @「test」;'或this:'[appDelegate setAString:@「test」];' – Nekto

回答

1

屬性aString有哪些屬性?很可能您使用的是retain屬性,它將(如名稱所示)在分配時保留基礎對象。因此,分配給appDelegate.aString後,你有一個NSString具有至少2的保留計數你NSLogrelease因此將使用對象有保留至少1

附錄的計數:您的聲明[appDelegate.aString stringWithString:@"test"];是空的。它調用實​​例上的類方法(本身不是一個好主意),但此方法返回一個新字符串,其內容爲test。你要求這個字符串,並立即丟棄它。 aString而不是被這種方法改變。

+0

是的我的財產設置爲(非原子,保留)。我應該使用什麼財產? – ShiniFox

+0

這不是你應該改變屬性的屬性('保留'是好的)。你只需要以不同的方式使用它。要釋放'retain'屬性元素的內容,請將該屬性設置爲'nil'。你仍然需要'釋放'本地創建的'NSString'實例,就像你現在所做的那樣。 –

1

您沒有正確使用屬性。您的代碼應閱讀:

appDelegate = [[UIApplication sharedApplication] delegate]; 

appDelegate.aString = [NSString stringWithString:@"test"]; // This will be retained by your appDelegate 
appDelegate.aString = nil; // This will cause your appDelegate to release the variable 

NSLog(@"%@",appDelegate.aString); // don't put objects directly in to NSLog 

因爲它代表你已經創建了一個自動釋放的對象(stringWithString),然後將其設置爲你的財產再保留它。

0

您應該使用XCode內置的「分析」系統。 shift⌘a - 編譯和分析。

它會告訴你很好的藍色箭頭,你保留,釋放和overretain/overrelase變量。

+0

嗯,我真的不明白這是如何工作的<<,但箭頭似乎沒有超出我聲明我的變量的方法,然後以另一種方法釋放它。我仔細查看了我的代碼,並且有1個分配給1個發佈...每次... – ShiniFox

+0

閱讀@Jrturton的帖子,他解釋了這一點。添加到分析功能後,您應該回到正軌。 – Kheldar