美文网首页
assign/retain/copy

assign/retain/copy

作者: Jin丶hy | 来源:发表于2017-05-12 17:54 被阅读8次

    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

          本文链接:https://www.haomeiwen.com/subject/jjzztxtx.html