簡體   English   中英

ARC下未釋放的Objective-C屬性

[英]Objective-c property not released under the ARC

我想測試弧形下的屬性屬性。 我在Class1.h (接口文件)下創建了兩個NSString屬性:

@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

我在testMethod2方法中放置一個斷點,然后檢查我的NSString屬性。 我假設str2設置為nil,但是運行代碼后的結果是:

2015-07-03 14:14:04.412 ARCTEST [12303:6239959] exampleString1

2015-07-03 14:14:04.412 ARCTEST [12303:6239959] exampleString2

有人可以解釋一下為什么str2屬性未釋放嗎?

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

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

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

除了彼得和安德烈(Peter and Andrey)的正確答案之外,我還要補充一點,您永遠無法確定是否已釋放對象並將弱引用設置為nil

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

期望解除分配只是錯誤的觀點。 您放棄參考,僅此而已。 在參考中思考,而不是在生活中思考。

如果您希望引用為nil ,請取消引用。 不要依賴MM,因為它不是為此而設計的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM