copy和mutableCopy

copy和mutableCopy

  • copy
    • 只會產生不可變的副本對象(比如NSString)
  • mutableCopy
    • 只會產生可變的副本對象(比如NSMutableString)
  • copy和mutableCopy來自NSObject,適用于所有的對象

copy和mutableCopy拷貝系統對象

源對象類型 拷貝方法 副本對象類型 是否產生了新對象 拷貝類型
NS* copy NS* 淺拷貝
NS* mutableCopy NSMutable* 深拷貝
NSMutable* copy NS* 深拷貝
NSMutable* mutableCopy NSMutable* 深拷貝
  • 注:*是通配符,比如NSString,NSMutableString,NSArray,NSMutableArray, NSDictionary,NSMutableDictionary
  • 注:深拷貝 == 內容拷貝;淺拷貝 == 指針拷貝;

copy拷貝自定義對象

  • 首先自定義對象需要遵守協議<NSCopying>
  • 需要重寫方法-(id)copyWithZone:(NSZone *)zone,返回自定義的對象
  • [person copy];copy方法內部會調用-(id)copyWithZone:(NSZone *)zone
  • copy方法拷貝的自定義對象是可變的
-(id)copyWithZone:(NSZone *)zone
{
    // zone是系統已經分配好的內存空間
    ZMJPerson *person = [ZMJPerson allocWithZone:zone] init];
    person.age = self.age;
    person.money = self.money;
    return person;
}

mutableCopy拷貝自定義對象

  • 首先自定義對象需要遵守協議<NSMutableCopying>
  • 其次需要重寫方法- (id)mutableCopyWithZone:(NSZone *)zone
  • 但一般沒有必要使用mutableCopy拷貝自定義對象,因為使用copy方法拷貝的自定義對象也是可變的,兩個方法的作用一樣,一般使用copy拷貝自定義對象

copy和strong在@property參數中使用的比較

@property (nonatomic, strong) NSString *name;
@property (nonatomic, copy) NSString *name;
  • 如果使用strong,對應的name屬性的setter方法是直接賦值(指針拷貝)
    - (void)setName:(NSString *)name
    {
      _name = name;
    }
  • 如果使用copy,對應的name屬性的setter方法是先將name對象拷貝(有可能指針拷貝,有可能是內容,取決于具體的對象),然后賦值
    - (void)setName:(NSString *)name
    {
      _name = [name copy];
    }

copy在@property參數中使用的注意點

  • 以下代碼會出現嚴重的問題
@property (nonatomic, copy) NSMutableString *name;
  • 分析
    • copy拷貝的對象永遠是不可變的,也就是name對象是不可變的,因為它內部賦值方式是_name = [name copy];
    • 使用NSMutableString聲明可變的指針指向不可變的name字符串對象,極其不合理,外界以為是NSMutableString類型,一旦調用appendString:方法,會直接報錯,因為name對象本質是不可變的;
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容