欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数组的修饰符

程序员文章站 2022-07-15 08:03:40
...

个人理解,只为加深印象,有疑问可留言进行交流,谢谢大家!!
我一直习惯用strong来修饰NSArray,好多同事也是如此,网上还有很多人说除了NSString用copy,其他对象类型都用strong。但是大家有没有考虑过当用strong修饰NSArray的时候,如果遇到用可变数组给它赋值怎么办?

@property (nonatomic ,strong)NSMutableArray *marray;
@property (nonatomic ,strong)NSArray *array;
//执行如下代码
    self.marray = [NSMutableArray arrayWithObjects:@1, nil];
    self.array = [NSArray array];
    self.array = self.marray;
    [self.marray addObject:@2];
    NSLog(@"%@",self.marray);
    NSLog(@"%@",self.array);

运行结果如下:

2017-01-13 14:40:47.384 copy使用[13866:1061182] self.marray = (
    1,
    2
)
2017-01-13 14:40:47.386 copy使用[13866:1061182] self.array = (
    1,
    2
)

也就是说,self.array在没有被直接操作的情况下,跟着self.mutableArray 变化了,这是很危险的。

如果把self.array用copy修饰的话:

@property (nonatomic ,copy)NSArray *array;

运行结果如下:

2017-01-13 14:43:45.291 copy使用[13909:1062768] self.marray = (
    1,
    2
)
2017-01-13 14:43:45.292 copy使用[13909:1062768] self.array = (
    1
)

这次self.array不会跟随self.mutableArray 变化了。

使用copy修饰对象,会重新开辟一片新的内存,内存地址是自主分配的,拷贝结束之后,两个对象虽然存的值是相同的,但是内存地址不一样,两个对象也互不影响,互不干涉。所以再次修改self.mutableArray的时候self.array是不受影响的

如果可变数组给可变数组赋值的情况下,用copy修饰就会出现崩溃

@property (nonatomic ,copy)NSMutableArray *marray;
@property (nonatomic ,copy)NSMutableArray *mutableArray;
//修饰可变数组要用strong,如果用copy修饰会出现莫名的崩溃
    self.mutableArray = [NSMutableArray arrayWithObjects:@1,@2, nil];
    
    self.marray = self.mutableArray;
    
    NSLog(@"self.marray = %@",self.marray);
    NSLog(@"self.mutableArray = %@",self.mutableArray);
    
    [self.marray removeObjectAtIndex:0];

运行结果

[__NSArrayI removeObjectAtIndex:]: unrecognized selector sent to instance 0x608000029e80

如果换成strong修饰就ok了

@property (nonatomic ,strong)NSMutableArray *marray;
@property (nonatomic ,strong)NSMutableArray *mutableArray;
self.marray = (
    1,
    2
)
2017-01-13 15:09:49.834 copy使用[14265:1076860] self.mutableArray = (
    1,
    2
)

个人觉得,如果用copy修饰可变数组的话,因为对这个数组进行了增删改操作,而copy后的数组变成了不可变数组