copy和mutableCopy
- copy
- 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對象本質是不可變的;
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。