天天看點

iOS @property中的NSString, NSArray, NSDictionary屬性為什麼大多時候用copy而不用strong的原因

//聯系人:石虎  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:

iOS @property中的NSString, NSArray, NSDictionary屬性為什麼大多時候用copy而不用strong的原因

謝謝!!!