MRC下重寫setter和getter方法
代碼如下:
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic, copy) NSString *name;
@end
#import "Person.h"
@implementation Person
@synthesize name = _name;
- (void)setName:(NSString *)name{
if (_name != name) {
[_name release];
_name = [name copy];
}
}
- (NSString *)name{
return _name;
}
@end
copy和setter的選擇
總結(jié):
- 對于不可變對象(NSString稍味、NSArray、NSDictionary等),使用copy修飾烛愧。
- 對于可變對象(NSMutableString怜姿、NSMutableArray疼燥、NSMutableDictionary等),使用strong修飾搏恤。
crash問題
把NSMutableArray用copy修飾有時就會crash湃交,因為對這個數(shù)組進行了增刪改操作搞莺,而copy后的數(shù)組變成了不可變數(shù)組NSArray,沒有響應的增刪改方法迈喉,所以對其進行增刪改操作就會報錯温圆。
測試過程
以數(shù)組為例總結(jié):
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic, strong) NSMutableArray *arr_strong;
@property (nonatomic, copy) NSMutableArray *arr_copy;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSMutableArray *tempArr = [NSMutableArray arrayWithCapacity:0];
self.arr_strong = tempArr;
self.arr_copy = tempArr;
NSLog(@"arr_strong = %@\n arr_copy = %@",[self.arr_strong class],[self.arr_copy class]);
}
@end
輸出結(jié)果:
arr_strong = __NSArrayM(可變數(shù)組)
arr_copy = __NSArray0(不可變數(shù)組)
所以此時如果對arr_copy進行增刪改操作岁歉,會造成程序上的崩潰。
數(shù)據(jù)變化問題
條件:
針對數(shù)據(jù)變化的問題饱搏,會在將可變對象賦值給用strong修飾的不可變對象時產(chǎn)生置逻。
測試代碼:
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic, strong) NSArray *arr_strong;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSMutableArray *tempArr = [NSMutableArray arrayWithCapacity:0];
[tempArr addObject:@"A"];
self.arr_strong = tempArr;
NSLog(@"arr_strong = %@",self.arr_strong);
[tempArr addObject:@"B"];
NSLog(@"arr_strong = %@",self.arr_strong);
}
@end
輸出結(jié)果:
arr_strong = (
A
)
arr_strong = (
A,
B
)
如果把arr_strong屬性修飾改成copy
輸出結(jié)果:
arr_strong = (
A
)
arr_strong = (
A
)
copy collections
深拷貝和淺拷貝的區(qū)別
如下圖所示:
淺拷貝就是指針拷貝鬓催;深拷貝就是內(nèi)容拷貝恨锚。
copy和mutableCopy
1.不可變對象使用copy,是一個淺拷貝。
2.不可變對象使用mutableCopy蜗顽,深拷貝雨让。
3.可變對象copy和mutableCopy,都是深拷貝崔挖。
但是對于集合類對象來說:上面的深拷貝都是單層深拷貝庵寞,并非完全深拷貝捐川。
集合類對象實現(xiàn)單層深拷貝
initWithArray:copyItems: 將第二個參數(shù)設置為YES即可深復制。
NSArray *deepCopyArray=[[NSArray alloc] initWithArray: array copyItems: YES];
deepCopyArray內(nèi)部存儲元素瘸右,對于不可變元素是指針拷貝岩齿,對于可變元素是內(nèi)容拷貝。類似于內(nèi)部每個元素調(diào)用了copy方法龄章。
集合類對象實現(xiàn)完全深拷貝
將集合進行歸檔(archive)瓦堵,然后解檔(unarchive)。
NSArray *trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:oldArray]];
參考資料:
Copying Collections
iPhone Dev:iOS開發(fā)之深拷貝與淺拷貝(mutableCopy與Copy)詳解
Blog:copy 與 mutableCopy