【问题标题】:Objective-C: @property and @synthesize and Memory LeaksObjective-C:@property 和 @synthesize 以及内存泄漏
【发布时间】:2011-12-16 20:24:40
【问题描述】:

我正在尝试真正了解一些内存管理问题。并找到了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,并可能导致内存泄漏?

【问题讨论】:

标签: objective-c memory-management


【解决方案1】:

调用不带“self”的属性名称。跳过设置器并直接更新实例变量。

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

@synthesize objA = _objA;

你的班级应该是这样的:

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

现在,如果你忘记了“self.”,你会得到一个编译器错误,它会更明确地说明你实际使用的变量。

【讨论】:

    【解决方案2】:

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

    1.自动释放

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

    遍历“retain”属性的设置器会增加保留计数。 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]; 
    

    【讨论】:

      【解决方案3】:

      objA = [[ObjectA alloc] init];不使用setter方法,而是直接设置实例变量。所以保留计数将是 1,来自 alloc

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-05
        • 2011-06-07
        • 1970-01-01
        • 2013-05-23
        • 2011-06-07
        • 1970-01-01
        相关资源
        最近更新 更多