//聯系人:石虎 QQ: 1224614774昵稱:嗡嘛呢叭咪哄
一、代碼實作數組指派不用copy資料分析
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic,strong)NSArray *array;//全局不可變數組
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSMutableArray *mArray = [NSMutableArrayarray];
[mArray addObject:@"shihu"];
self.array = mArray;
[mArray addObject:@"zhangying"];
NSLog(@"self.array --->%@ ,mArray --> %@",self.array,mArray);
}
提問:大家猜猜控制器會輸出什麼資料???
列印結果:
2017-09-10 12:19:28.300找bug~demo[74440:1165432] self.array --->(
shihu,
zhangying
) ,mArray --> (
shihu,
zhangying
)
原因很簡單, 因為Objective-C支援多态.
是以表面上self.array是NSArray對象, 其實骨子裡是NSMutableArray對象.這樣的話将會對後期DEBUG增加很大的成本, 可能會導緻莫名其妙的錯誤.
二、用copy資料分析
- (void)viewDidLoad {
[super viewDidLoad];
NSMutableArray *mArray = [NSMutableArrayarray];
[mArray addObject:@"shihu"];
//self.array = mArray;
self.array = [mArraycopy];//淺拷貝一次
[mArray addObject:@"zhangying"];
NSLog(@"self.array --->%@ ,mArray --> %@",self.array,mArray);
}
提問:大家猜猜控制器會輸出什麼資料???
列印結果:
2017-09-10 12:25:27.720 找bug~demo[74493:1169444] self.array --->(
shihu
) ,mArray --> (
shihu,
zhangying
)
結論:這樣就能保證不管指派的是可變還是不可變數組, NSArray就是NSArray了
三、補充圖表更加了解copy與mutableCopy的差別:
圖1:
謝謝!!!