繁体   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