2015-07-03 29 views
1

我想測試弧下的屬性屬性。Objective-c屬性沒有在ARC下發布

@interface Class1 : NSObject 
@property (nonatomic, strong) NSString *str1; 
@property (nonatomic, weak) NSString *str2; 
@end 

然後,我已經創建下Class1.m(實現文件)的測試方法::

@implementation Class1 

- (void)testMethod { 
    NSString *strt1 = @"exampleString1"; 
    NSString *strt2 = @"exampleString2"; 

    self.str1 = strt1; 
    self.str2 = strt2; 

    strt1 = nil; 
    strt2 = nil; 

    dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, QOS_CLASS_BACKGROUND); 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(10 * NSEC_PER_SEC)), aQueue, ^{ 
     [self testMethod2]; 
    }); 
} 

- (void)testMethod2 { 
    NSLog(self.str1); 
    NSLog(self.str2); 
} 
@end 

I I已下Class1.h(接口文件)創建了兩個NSString屬性在testMethod2方法中設置一個斷點,然後檢查我的NSString屬性。我假設str2設置爲零,但我運行代碼後的結果是;

2015年7月3日14:14:04.412 ARCTEST [12303:6239959] exampleString1

2015年7月3日14:14:04.412 ARCTEST [12303:6239959] exampleString2

有人能解釋我爲什麼str2財產沒有釋放?

回答

3

因爲它是一個字符串文字。它將在整個應用程序的整個生命週期中保留在內存中。嘗試其他課程,你會看到它會被釋放。順便說一句,在處理字符串時,最好使用copy而不是strongweak

6

Objective-c使用字符串文字池。這就是所有字符串文字都是相同的(文本)指向相同的對象(因爲字符串是不可變的,所以它們是可用的)。這些字符串永遠不會被釋放。如果您將您的strt2的任務更改爲,它將按預期工作。

NSString *strt2 = [NSString stringWithFormat:@"%@", @"exampleString2"]; 
0

除了彼得和安德烈的正確答案,我想補充一點,你不能確定一個對象被釋放和弱引用設置爲nil

  • ARC不保證儘早釋放對象。
  • 可以在ARP中創建一個對象。在這種情況下,它在返回到運行循環之前不會被釋放。
  • 一個對象可以被緩存以供重用。

這只是錯誤的觀點,期待一個釋放。你放棄了參考,沒有別的。在參考文獻中思考,而不是在生活中。

如果您想要引用nil,請將其刪除。不要依賴MM,因爲它不是爲此而設計的。