我想我遗漏了一些关于属性的东西。
首先,我无法理解retain
和assign
之间的区别。
如果我使用assign
,该属性是否会将retain
计数器增加1到setter以及getter,我是否需要对它们两者使用release
?
这如何与readwrite
或copy
一起使用?从retain
计数的角度来看。
我试图理解在使用属性(setter和getter)之后需要使用release
的时间
@property (readwrite,assign) int iVar;
assign
在这做什么?
有什么区别:
@property (readwrite,assign) int iVar;
和
@property (readwrite,retain) int iVar;
和
@property (readwrite) int iVar;
非常感谢......
答案 0 :(得分:11)
之间有什么不同:@property(readwrite,assign)int iVar;到@property(readwrite,retain)int iVar;到@property(readwrite)int iVar;
@property (readwrite,assign) sometype aProperty;
的setter在语义上等同于
-(void) setAProperty: (sometype) newValue
{
ivar = newValue;
}
如果你提出
,你或多或少会得到什么@asynthesize aProperty = ivar;
在您的实施中。
@property (readwrite,retain) sometype aProperty;
的setter在语义上等同于
-(void) setAProperty: (sometype) newValue
{
[newValue retain];
[ivar release];
ivar = newValue;
}
显然,保留或释放int是没有意义的,因此某些类型必须是id
或SomeObjectiveCClass*
@property (readwrite,copy) sometype aProperty;
的setter在语义上等同于
-(void) setAProperty: (sometype) newValue
{
sometype aCopy = [newValue copy];
[ivar release];
ivar = aCopy;
}
在这种情况下,不仅某些类型必须是一个客观的C类,而且它必须响应-copyWithZone:
(或等效地,实现NSCopying
)。
如果省略保留或分配或复制,则默认为assign。
顺便说一句,我通过不考虑发生的锁定来简化上述内容,因为属性也没有指定nonatomic
。
答案 1 :(得分:4)
有两种说明符:
readwrite
说明符告诉该属性是可读/写的,因此当你执行@ synthesize
时,它将同时创建getter和setter。
还有readonly
,指定该属性只有一个getter。
其他修饰符指定属性在引用计数方面的行为方式:
assign
修饰符告诉ivar将被简单地分配给setter接收的任何内容。因此,如果是对象,则不会调用retain
。
使用retain
时,无论何时使用合成的setter,都会调用retain
,因此将保留该对象。这意味着具有setter的类在某些时候需要release
(可能在其dealloc
方法中)。
对于copy
,这意味着该对象将收到retain
消息,而不是copy
。这意味着你最终会得到原始对象的副本,保留计数为1,所以你还要负责释放它。