Objective-C:@property 和 @synthesize 以及内存泄漏

标签 objective-c memory-management

我试图真正理解一些内存管理问题。并找到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/

相关文章:

ios - 如何每天更新一次 UILabel

c++ - std::get_temporary_buffer 返回原始指针而不是智能指针

python - 在 Python 中将 long 从寄存器转换为 char 数组

objective-c - 为字符串数组的每个元素添加前缀

objective-c - 检查 CALayer 是否已经添加为子层

ios - 同时选择另一个表格 View 单元格时如何取消选择表格 View 单元格?

c++ - 我如何使用 std::allocator 代替 realloc?

iphone - ImageView contentMode 在视网膜和非视网膜显示中不同

c++ - 带有数组的 boost::ptr_vector:我可以确定它的析构函数调用 delete[] 而不是 delete 吗?

haskell io流内存