objective-c中所有属性的getter都是一样的吗?



这个简单的问题一直困扰着我。

的getter是否相同?
@property (nonatomic, retain) NSString *name
@property (nonatomic, copy) NSString *name 
- (NSString*) name{
    return name;    
}

根据文档

然而,属性声明提供了关于的附加信息如何实现访问器方法(如"Property声明属性")。

getter和setter行为都是由属性声明定义的。在您的示例中,这是正确的,因为它定义为nonatomic,但如果声明中缺少nonatomic,则将实现类似于此

- (NSString*) name{
    [_internal lock]; // lock using an object-level lock
    id result = [[name retain] autorelease];
    [_internal unlock];
    return result;
}

当然,这只有在你使用@synthesize并且不重写或改变getter和setter方法时才成立。

是的,正如其他答案所述,getter是相同的。选项retaincopyassign决定如何生成设置,但不决定这些设置的名称。

如果您想使用不同的getter名称,例如,如果您有BOOL,例如UIApplication属性idleTimerDisabled,那么您可以通过指定getter名称来实现:

@property(nonatomic, getter=isIdleTimerDisabled) BOOL idleTimerDisabled

如果没有这样的重写,getter名总是属性名。

是的,它们是一样的。retain, copyassign只给编译器如何生成setter的指令,而不是getter。

是的,copyretain只影响setter而不影响getter。另外,对于像NSString这样的不可变对象,应该选择copy而不是retain

如果您正在使用ARC(自动引用计数),那么getter应该都像您上面看到的那样。但是ARC的新标准是使用strongweak,而不是分别使用retainassignretainassign仍然可以工作,并且与strongweak同义,但是任何新生成的文件都会使用这些词,所以理解它们的意思很重要。

如果你没有使用ARC(仍然是一个选项,即使在iOS 5和Lion) getter 可以根据retain, copyassign而不同。

retaincopy看起来都像:

- (NSString *)name {
    return [[name retain] autorelease];
}

assign是非常基本的,但通常用于弱引用(如委托):

- (id)delegate {
    return delegate;
}

我对此进行了一些详细说明,因为在使用ARC时理解这一点很重要,所有3个代码看起来都是一样的,但行为仍然非常像上面写的。如果您使用atomic而不是nonatomic,那么您需要添加一些锁定/解锁行以使该方法线程安全。在任何情况下,通常最好使用由@synthesize生成的默认访问器,除非您想做一些非常棘手的事情。

是的。getter名称仅依赖于属性名称

相关内容

最新更新