【问题标题】:@synthesize feathers = _feathers? [duplicate]@synthesize 羽毛 = _feathers? [复制]
【发布时间】:2012-03-21 08:18:24
【问题描述】:

可能重复:
What exactly does @synthesize do?
Can someone explain this @synthesize syntax?

@interface Duck : NSObject {

    NSArray *_feathers;

}
@property (nonatomic,retain) NSArray *feathers;

@end

@implementation Duck

@synthesize feathers=_feathers;

@end

我想知道你在做@synthesize feathers = _feathers 时到底发生了什么?

【问题讨论】:

标签: objective-c


【解决方案1】:

在你的情况下(因为你的属性是非原子的)

@synthesize feathers=_feathers;

等于

- (void)setFeathers:(NSArray *)newFeathers 
{
    if (newFeathers != _feathers)
    { 
        [_feathers release];
        _feathers = [newFeathers retain];
    }
}

- (NSArray *)feathers
{
    return feathers_;
}

【讨论】:

  • 不完全——你还必须检查 setter 中的 _fathers != fathers 以防你错误地用你的第一个 release 解除了父对象。 (处理问题的另一种方法是autorelease 而不是release
  • @deanWombourne 或者在释放旧值之前保留新值,这样如果它是同一个对象,retainCount 就不会下降到 0。
  • @SlippD.Thompson 这就是我的意思:) - 不过你的解释更好!
  • @deanWombourne 在我看来这是两种不同的方法。您的(检查两个变量是否不是完全相同的对象/值)在 setter 具有不想触发的其他副作用或处理分配的值时效果更好不是对象指针。 retain-before-retain 方法适用于棘手的所有权情况……在传递所有权、处理线程以及其他我现在不记得的时候,通常会尽量避免。无论如何,它有它的时间和地点(通常是在同一时间和地点,一个人正在挠头)
  • 啊,我会通过 autorelease 而不是 release 在初始对象上完成你的“额外保留而不是 if”方法 :) 我想这取决于你希望你的内存管理如何工作。
猜你喜欢
  • 2018-08-22
  • 2012-11-11
  • 1970-01-01
  • 2021-06-12
  • 2019-09-21
  • 2013-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多