这个简单的问题一直困扰着我。
的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是相同的。选项retain
、copy
和assign
决定如何生成设置,但不决定这些设置的名称。
如果您想使用不同的getter名称,例如,如果您有BOOL
,例如UIApplication
属性idleTimerDisabled
,那么您可以通过指定getter名称来实现:
@property(nonatomic, getter=isIdleTimerDisabled) BOOL idleTimerDisabled
如果没有这样的重写,getter名总是属性名。
是的,它们是一样的。retain
, copy
和assign
只给编译器如何生成setter的指令,而不是getter。
是的,copy
和retain
只影响setter而不影响getter。另外,对于像NSString
这样的不可变对象,应该选择copy
而不是retain
。
如果您正在使用ARC(自动引用计数),那么getter应该都像您上面看到的那样。但是ARC的新标准是使用strong
和weak
,而不是分别使用retain
和assign
。retain
和assign
仍然可以工作,并且与strong
和weak
同义,但是任何新生成的文件都会使用这些词,所以理解它们的意思很重要。
如果你没有使用ARC(仍然是一个选项,即使在iOS 5和Lion) getter 可以根据retain
, copy
或assign
而不同。
retain
和copy
看起来都像:
- (NSString *)name {
return [[name retain] autorelease];
}
assign
是非常基本的,但通常用于弱引用(如委托):
- (id)delegate {
return delegate;
}
我对此进行了一些详细说明,因为在使用ARC时理解这一点很重要,所有3个代码看起来都是一样的,但行为仍然非常像上面写的。如果您使用atomic
而不是nonatomic
,那么您需要添加一些锁定/解锁行以使该方法线程安全。在任何情况下,通常最好使用由@synthesize
生成的默认访问器,除非您想做一些非常棘手的事情。
是的。getter名称仅依赖于属性名称