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.300bug~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:



谢谢!!!