NSObject-拷贝 NSCopy-NSMutablecopy

本文详细解析了NSCopy和NSMutableCopy的区别与应用场景,并通过示例代码展示了如何在Objective-C中实现这两种拷贝方法。


NSCopy-NSMutablecopy


  •  浅拷贝:不产生新的对象,直接指向原有对象   浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间。
  • 深拷贝:产生新的对象(新地址),其内容是原有对象的内容
       
      NSCopy 拷贝出的结果是不可变对象,跟其接受类型没有关系,跟其传入类型也没有关系, NSMutablecopy 拷贝的结果是可变对象,跟其传入的类型没有关系,但是会受其接收类型的影响,

      当使用 NSCopy 复制一个不可变对象时,其行 为是浅复制,其余情况都是深拷贝
      当使用 NSMutablecopy时,是深拷贝

如下:

 拷贝行为属于拷贝出的结果
NSCopy复制一个不可变对象浅复制不可变对象
复制一个可变对象深拷贝
NSMutablecopy深拷贝受接收类型影响


通过一个示例程序来补充下细节



main.m

#import <Foundation/Foundation.h>

#import "Person.h"


int main( int argc, const char * argv[]) {
   

    @autoreleasepool {

         Person *p = [[ Person alloc ] init ];        

        NSMutableString *s = [ NSMutableString stringWithFormat : @" 汉三 " ]; // 对可变字符串进行操作,地址不会变化,改变的是内容。对不可变字符串的重新赋值,地址内容都会改变。

       

        p. name = s; //

        NSLog ( @"%p,%p" ,p. name ,s); // 打印: 0x100114990,0x100114a80

        Person *p1 = [p mutableCopy ]; //p 属于 Person 类对象,[]内调用方法必须在该类中存在该方法的协议和实现     // 此处使用: Person *p1 = [p mutableCopy];     示例

        NSLog ( @"%@,%@" ,p1,p);

        [s setString : @" 王五 " ];

        p1. name = s;

        NSLog ( @"%@,%@,%p,%p" ,p,p1,p1. name ,s); // 如果不用 copy ,对象属性的值会一直跟着变

        // 打印 0x100300160,0x100114a80

    }

    return 0 ;

}


Person.h

// 如果自定义类想要实现拷贝操作,首先需要遵循 NSCopying NSMutableCopying 协议,

#import <Foundation/Foundation.h>

@interface Person : NSObject < NSCopying , NSMutableCopying > // 协议不能少

@property ( nonatomic , copy ) NSString *name; //NSCopy 拷贝出的结果是不可变对象

@end


Person.m

#import "Person.h"

@implementation Person
-(

-( NSString *)description{   

    return _name ;
}

}

// 如果直接 return self ,则是浅拷贝,如果使用 alloc ,则是深拷贝

-( id )copyWithZone:( NSZone *)zone{
   
     Person *p = [ Person allocWithZone :zone];

  // p.name = [self.name copy];

    return p;
}

}

// 如果直接 return self ,则是浅拷贝,如果使用 alloc ,则是深拷贝

-( id )mutableCopyWithZone:( NSZone *)zone{
   

    Person *p = [ Person allocWithZone :zone];
   

    // p.name = [self.name copy];

    return p;
}

}


@end

       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值