常用的基本类型
iOS OC 基本类型
assign、copy、strong,weak
基本概念
- assign 修饰基本数据类型,NSInteger、BOOL
- copy 、strong、weak 都修饰对象。
需要注意的点
assign
可以修饰对象,但是容易crash,容易才能悬空指针,修饰的对象释放后,指针不会自动置成nil,此时再向对象发消息程序会崩溃。
修饰对象类型时,不改变其引用计数。
weak
非拥有关系
修饰对象类型时,不改变其引用计数,对象释放后,指针为nil,既不保留新值,也不释放旧值。
strong
拥有关系
设置新值,保留新值,会释放旧值。
改变对象的引用计数
copy
浅拷贝
拷贝对象的内存地址,让目标对象和源对象指向同一片空间,增加引用计数。
深拷贝
目标对象和源对象指向两片内容相同的内存空间
@property(copy) NSMutableArray *array?
如果赋值过来的是NSMutableArray, copy 之后是NSArray 深拷贝
如果赋值过来的是NSArray, copy 之后是NSArray 潜拷贝
copy 修饰的对象得到的是不可变对象
mutableCopy 修饰的对象是可变的对象 都是深拷贝
日常开发遇到的坑
问题一
用assign 修饰的对象 会发生一些信号量的crash。
问题二
testThreeCopy 需要重点注意
@property (nonatomic, strong) NSMutableArray *mutableArray;
- (void)testCopy{
NSArray *arrayOne = [[NSArray alloc] init];
self.mutableArray = arrayOne;
[self.mutableArray addObject:@"1"];
}
- (void)testTwoCopy{
NSArray *arrayOne = [[NSArray alloc] init];
self.mutableArray = [arrayOne mutableCopy];
[self.mutableArray addObject:@"1"];
}
- (void)testThreeCopy{
NSMutableArray *arrayOne;
if (!arrayOne) {
arrayOne = [[NSArray alloc] init];
}
self.mutableArray = arrayOne;
[self.mutableArray addObject:@"1"];
}