我试图真正理解一些内存管理问题。并找到this question ,这部分回答了我的问题。
例如,在 MyObject 中,我将一个实例变量声明为属性,并在实现文件中正确合成:
@interface MyObject : NSObject
...
ObjectA objA;
...
@property (nonatomic, retain) ObjectA *objA;
@end
在某个任意点,我实例化了 objA。我知道
self.objA = _objA;
调用合成访问器。从逻辑上讲,这意味着 self.objA = [[ObjectA alloc] init];
会导致内存泄漏,因为保留计数会比预期的多一个(我知道直接检查保留计数并不是检查对象将在内存中保留多长时间的准确方法)。是否
objA = [[ObjectA alloc] init;
也调用setter,并可能导致内存泄漏?
最佳答案
调用不带“self”的属性名称。跳过 setter 并直接更新实例变量。
为了避免混淆和潜在的内存泄漏,我喜欢像这样重命名合成属性的实例变量:
@synthesize objA = _objA;
您的类(class)将如下所示:
@interface MyObject : NSObject
...
@property (nonatomic, retain) ObjectA *objA;
@end
现在,如果你忘记了“self.”,你会得到一个编译器错误,并且它会更明确地说明你实际使用的变量。
关于Objective-C:@property 和 @synthesize 以及内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8539700/