2012-06-10 48 views
0

的代碼只是簡單:哪種情況會導致內存泄漏?

@interface Test : NSObject 
@property (nonatomic, strong) NSString * str; //strong 
//@property (nonatomic, weak) NSString * str; //weak 
-(void)func; 
@end 

@implementation Test 
@synthesize str = _str; 
-(void)func{ 
    _str = @"test string";  // using ivar 
    //self.str = @"test string"; // using setter 
} 
@end 

four的情況在上面的代碼中,強/弱,伊娃/ setter方法

哪種類型將導致內存泄漏?

哪些類型是一樣的?

我用NSLog測試了代碼,但都運行正常(沒有零印),爲什麼?約autorelease

--------------編輯---------------

我閱讀文檔,發現「字符串常量會永遠不會釋放」

所以當串initWithString或initWithFormat初始化代碼行爲不同的(我寫的代碼是錯誤的)

弱財產使用initWithFormat

內存管理伊娃的時候永遠是零和二傳手是一樣的:Is self.iVar necessary for strong properties with ARC?

+0

你是怎麼測試它的?通過具有字符串字面值(類似'@「hello world」')?如果您使用了字符串文字,那麼您的「測試」已被破壞,因爲它們不會被釋放... –

+1

字符串屬性通常會被複制而不是保留。擁有別人可能改變的保留價值可能不是你想要的。您可以爭論什麼是「必要的」,但是使用setter是一種很好的做法,因爲它會強制您爲屬性定義的行爲(如釋放舊值並保留或複製新值)。使用setter和getters也將確保KVO的工作。如果您只是更改變量,KVO將無法工作。 –

回答

0

如果您使用ARC,則系統會處理內存並且不會將其報告爲泄漏。這裏有一個很好的寫法來檢查ARC和強和弱引用之間的區別。

http://www.quora.com/Objective-C-programming-language/In-Objective-C-whats-the-difference-between-a-strong-and-weak-pointer

+0

我讀過這篇文章,現在在我腦海裏,'weak'應該是錯誤的方式,對象將會在早些時候被釋放,但是如果'strong'情況下'_str'與'self.str'相同? – kran

0

我總是弄糊塗​​了這個太,但我覺得基本上弱意味着在類被設置爲nil它會自行消失,而強不會讓類走,直到VAR也因爲它有一個+1保留計數開始。

你不能真正問問哪一個會導致泄漏,因爲如果使用得當,兩者都不能正確使用。