数据的基本类型

常用的基本类型

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 修饰的对象是可变的对象 都是深拷贝
数据的基本类型_第1张图片
image.png

日常开发遇到的坑

问题一
用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"];
}

你可能感兴趣的:(数据的基本类型)