• copy-mutableCopy


      copy和mutableCopy语法的目的:改变副本的时候,不会影响到源对象;调用Copy产生的对象是不可变的,调用mutableCopy产生的对象是可变的,与调用对象是否可变无关。

      Copy 需要先实现NSCoppying协议,创建的是不可变副本(如字符串、数组、字典)。

      mutableCopy 需要先实现NSMutableCopying协议,创建的是可变副本(如可变字符串、可变数组、可变字典)。

      如果想自定义copy,那么就必须遵守NSCopying,并且实现copyWithZone:方法。

      如果想自定义mutableCopy,那么就必须遵守NSMutableCopying,并且实现mutableCopyWithZone:方法。

    1、不可变字符串的mutableCopy(深拷贝):// 深拷贝:内容拷贝,会产生新的对象。新对象计数器置为1,源对象计数器不变。

    NSString *string = [[NSString alloc] initWithFormat:@"age is %i", 10];
    NSMutableString *str = [string mutableCopy]; // 产生了一个新的对象,计数器为1。源对象的计数器不变; str和string不是相同对象。

    2、不可变字符串的copy(浅拷贝):// 浅拷贝:指针拷贝,不会产生新的对象。源对象计数器+1。只有一种情况是浅拷贝:不可变对象调用copy方法时。

    NSString *string = [[NSString alloc] initWithFormat:@"age is %i", 10];
    NSString *str = [string copy]; // copy产生的是不可变副本,由于源对象本身就不可变,所以为了性能着想,copy会直接返回源对象本身; 源对象计数器会+1; 在浅拷贝情况下,copy其实就相当于retain.

    3、可变字符串的copy(深拷贝):

    NSMutableString *string = [NSMutableString stringWithFormat:@"age is %i", 10];
    NSString *str = [string copy]; // 会产生一个新对象,str计数器为1。

    4、可变字符串的MutableCopy(深拷贝):

    NSMutableString *string = [NSMutableString stringWithFormat:@"age is %i", 10];
    NSMutableString *str = [string mutableCopy]; //会产生一个新对象,str计数器为1。

    5、@property中的参数copy策略:

    @property (nonatomic, copy) NSString *name;
    // copy代表set方法会release旧对象、copy新对象
    // 修改外面的变量,并不会影响到内部的成员变量
    // 建议:NSString一般用copy策略,其他对象一般用retain

    6、对象的copy:

    Student *stu1 = [Student studentWithName:@"stu1"];
    Student *stu2 = [stu1 copy];
  • 相关阅读:

    HTTP请求和响应格式
    什么是Alpha,Beta,RC,RTM,CTP版
    GE的分级体系与卫片的分辨率关系
    如何下载这幅DigitalGlobe卫星图?
    Google Maps/Earth下载图片封IP的最佳解决方法
    MAPGIS把经纬度坐标转换为大地坐标
    从Google卫星地图服务器上获取卫星照片的方法收藏
    谷歌地球 GoogleEarth软件介绍
    Oracle 查找表的字段信息
  • 原文地址:https://www.cnblogs.com/CJDog/p/5127467.html
Copyright © 2020-2023  润新知