繁体   English   中英

Objective-C:@property和@synthesize以及Memory Leaks

[英]Objective-C: @property and @synthesize and Memory Leaks

我试图真正了解一些内存管理问题。 并找到了这个问题 ,它部分回答了我的问题。

例如,在MyObject中,我有一个声明为属性的实例变量,并在实现文件中正确合成:

 @interface MyObject : NSObject
    ...
    ObjectA objA;
    ...
    @property (nonatomic, retain) ObjectA *objA;
@end

在任意点,我实例化objA。 我知道self.objA = _objA; 调用合成访问器。 从逻辑self.objA = [[ObjectA alloc] init]; ,这意味着self.objA = [[ObjectA alloc] init]; 会导致内存泄漏,因为保留计数会超过预期(我知道直接检查保留计数并不是检查对象在内存中的长度的准确方法)。

objA = [[ObjectA alloc] init; 还调用setter,可能会导致内存泄漏?

在没有“self”的情况下调用属性名称。 跳过setter并直接更新实例变量。

为了避免混淆和潜在的内存泄漏,我喜欢重命名合成属性的实例变量,如下所示:

@synthesize objA = _objA;

你的课将如下所示:

@interface MyObject : NSObject
    ...
    @property (nonatomic, retain) ObjectA *objA;
@end

现在,如果你忘记了“自我”,你将会遇到一个编译器错误,而且你会更明确地知道你实际使用的是哪个变量。

alloc / init的结果分配给原始实例变量是完全可以接受的,建议在初始化方法中设置实例变量。 为避免在使用合成设置器时泄漏内存,您可以采用两种方法。

1.自动释放

self.objA = [[ObjectA alloc] init] autorelease];

通过'retain'属性的setter会增加保留计数。 alloc / init也增加了保留计数,但是通过自动释放来平衡,这意味着它将减1并且当前事件循环结束。


2.首先分配给临时变量

// +alloc/-init increments the retain count of objectA to 1
ObjectA objectA = [[ObjectA alloc] init]; 

// Synthesized setter calls retain on objectA, incrementing to 2.
self.objA = objectA; 

// Decrement objectA's retain count to 1.
[objectA release]; 

objA = [[ObjectA alloc] init]; 不使用setter方法,而是直接设置实例变量。 因此,从alloc ,保留计数为1。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM