assign/retain/copy
2017-05-12 本文已影响8人
Jin丶hy
Objective-C中有两类对象,一类是结构体(或者基本数据类型也算),另一类是NSObject对象。
- 对于结构体,代码直接会操作其实体,因此赋值操作会创建一个源对象的副本(一个新的对象);
- 对于NSObject对象,必须使用指针来操作对象,所以其赋值操作相当于复制了指针,而非对象,也就是说赋值操作使得源指针和新指针都指向同一个NSObject对象。这样讲有些难以理解,请看下面的代码:
assign:###
简单赋值给新对象,不增加引用计数。也就是说,
- 当在结构体(或者基本数据类型也算)的时候,是创造一个就对象的副本;
- 当在NSObject对象的时候,会把对象的指针赋值。
- (void) setAssignProperty:(id)newValue
{
self->assignProperty = newValue;
}
一般用在:
**基本数据类型\int \float \double\CGRect \真假(BOOL)\结构体**
retain:###
释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1。也就是说,
- 当在NSObject对象的时候,会把旧对象的计数- 1,然后把输入对象的指针赋值给目标,然后新对象的计数+1。
-(void)setRetainProperty:(id)newValue
{
if (retainProperty != newvalue)
{
[retainProperty release];
retainProperty = [newValue retain];
}
}
一般用在:
一般对象如:NSNumber(除了NSTring 对象外)
copy:###
释放旧对象,建立一个索引计数为1的对象。也就是说,
- 当在NSObject对象的时候,会把旧对象的计数- 1,把输入对象的值和内容拷贝成副本(也就是有新的指针,新的一样的内容),把副本赋值给目标,计数+1。
-(void)setCopyProperty:(id)newValue
{
if (copyProperty != newvalue)
{
[copyProperty release];
copyProperty = [newValue copy];
}
}
一般用在:
NSString、NSMutableString、block