assign/retain/copy

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

你可能感兴趣的:(assign/retain/copy)