copy
通過 copy 產(chǎn)生的對象是不可變對象(eg. NSString锁右、NSArray失受、NSDictionary)
mutableCopy
通過 mutableCopy 產(chǎn)生的對象是可變對象(eg. NSMutableString、NSMutableArray咏瑟、NSMutableDictionary)
copy 和 mutableCopy拷貝過程
拷貝前 | 拷貝方法 | 拷貝后 | 是否產(chǎn)生新對象 | 拷貝類型 |
---|---|---|---|---|
NS* | copy | NS* | 否 | 淺拷貝 |
NS* | mutableCopy | NSMutable* | 是 | 深拷貝 |
NSMutable* | copy | NS* | 是 | 深拷貝 |
NSMutable* | mutableCopy | NSMutable* | 是 | 深拷貝 |
- 注:深拷貝 == 內(nèi)容拷貝拂到;淺拷貝 == 指針拷貝;
自定義對象使用 copy 和 mutableCopy方法
1码泞、必須實現(xiàn) NSCopying , NSMutableCopying 協(xié)議
2兄旬、copyWithZone:方法 和 mutableCopyWithZone:方法必須實現(xiàn)
#import <Foundation/Foundation.h>
@interface ZQObjCopy : NSObject <NSCopying,NSMutableCopying>
@property (nonatomic, copy) NSMutableString *name;
@property (nonatomic, copy) NSString *mutableStr;
@property (nonatomic,assign) int age;
@end
#import "ZQObjCopy.h"
@interface ZQObjCopy ()
@end
@implementation ZQObjCopy
- (id)copyWithZone:(NSZone *)zone{
ZQObjCopy *objCopy = [[[self class] allocWithZone:zone] init];
objCopy.name = [self.name copy];
objCopy.mutableStr = [self.mutableStr copy];
objCopy.age = self.age;
return objCopy;
}
- (id)mutableCopyWithZone:(NSZone *)zone{
ZQObjCopy *objCopy = [[[self class] allocWithZone:zone] init];
objCopy.name = [self.name mutableCopy];
objCopy.mutableStr = [self.mutableStr mutableCopy];
objCopy.age = self.age;
return objCopy;
}