【问题标题】:Getter Sequence Of Events?吸气剂事件序列?
【发布时间】:2009-09-10 19:06:38
【问题描述】:

我试图了解下面的 getter 中发生了什么,这是我目前所了解的:

(1) getter 返回一个指向 NSString 对象的指针。 (2) NSString 对象被保留,可能是因为我们刚刚给出了一个指向它的指针。 (3) 自动释放?什么时候激活,当 PlanetClass 实例被释放(释放)?

// CLASS
@interface PlanetClass : NSObject {
        NSString *planetName;
}
- (NSString *)planetName;
- (void)setPlanetName:(NSString *)value;
@end

// GETTER
- (NSString *)planetName{
        return[[planetName retain] autorelease];
}

编辑:我认为我对实际保留和稍后发布的原因感到更加困惑。我的理解是,getter 只是返回了一个指向 nil 或已经存在的对象(即由 setter 设置)的指针释放,这只是一个故障保险,以防我后来忘记释放 NSString 对象?

实例变量planetName也在我的dealloc方法中释放(见下文)autorelease似乎也在做同样的事情,只是稍后池耗尽时?

- (void)dealloc {
        [planetName release];
        [super dealloc];
}

干杯-加里-

【问题讨论】:

    标签: objective-c memory setter


    【解决方案1】:

    让 Objective-C 将其作为属性处理可能是个好主意,让您清理一些实现以保持内存管理,嗯,可管理:

    @interface PlanetClass : NSObject {
        NSString* planetName;
    }
    @property(nonatomic, retain) NSString* planetName;
    @end // PlanetClass
    
    @implementation PlanetClass
    @synthesize planetName
    //... rest of PlanetClass here
    @end // PlanetClass
    

    plentydocs available online 以获取有关 Objective-C 属性的更多详细信息和 @synthesize

    内存管理文档

    我强烈推荐this read from Apple on memory management 尝试帮助了解retain/release 喧嚣的所有内容。

    【讨论】:

    • 只是发现了不好的措辞并将其更改为吸气剂,对不起,飞行员错误。
    • 没错,我只是想了解事情是如何运作的,然后再跳到更简单的方法。
    【解决方案2】:

    当自动释放被发送到一个对象时,它被添加到自动释放池中。当池耗尽时,它会向池中的所有对象发送释放。所以自动释放池中的任何对象都会在池耗尽时被释放

    【讨论】:

      【解决方案3】:

      getter方法中的return/autorelease没有做任何事情,你可以直接返回planetName

      【讨论】:

      • 这不正确。保留后跟自动释放将确保有问题的对象在自动释放池耗尽之前不会被销毁。
      • 没错,但就本线程而言,它不会有任何区别。根据最初的问题,我假设 OP 并没有试图对自动释放池做任何偷偷摸摸的事情,他们只是想从一个对象中获取一个属性。
      • 这与 NSResponder 所说的原因非常相关。
      • 怎么样?在大多数情况下,额外的临时保留计数有何不同?我敢肯定,我们都可以提出一些具体的例子,它们会产生很大的不同,但这些并不正常,并且可能与我们对返回对象的保留计数所做的所有假设背道而驰。
      猜你喜欢
      • 2018-11-16
      • 1970-01-01
      • 2018-04-05
      • 2017-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-26
      • 2023-02-02
      相关资源
      最近更新 更多