iOS @property中的NSString, NSArray, NSDictionary屬性為什麼大多時候用copy而不用strong的原因 – iPhone手機開發 iPhone軟體開發教學課程

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

一、代碼實現數組賦值不用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:

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *