欢迎访问宙启技术站
智能推送

copy,assign,strong,retain,weak,readonly,nonatomic的区别

发布时间:2023-05-17 06:55:41

copy,assign,strong,retain,weak,readonly和nonatomic是Objective-C语言中常用的关键字,用于描述对象的属性,有着各自不同的含义和作用。下面将对它们进行详细的解释和比较。

1. copy

copy用于创建一个新的副本,并返回其指针。当使用赋值符号=将一个对象赋值给另一个对象时,如果源对象和目标对象的属性都是copy类型,则会对源对象进行拷贝,并将拷贝后的副本赋值给目标对象。这样可以保证两个对象之间互不影响,从而实现值类型的传递。

例子:

@property (copy, nonatomic) NSString *name;

NSString *shadowName = [self.name copy]; //创建name的副本

2. assign

assign用于把一个对象的指针赋值给另一个对象。当源对象和目标对象的属性都是assign类型时,会直接把源对象的指针赋值给目标对象,不会进行拷贝。这样可能会出现问题,因为如果源对象在语句执行完后被释放,目标对象将指向一块无效的内存区域。

例子:

@property (assign, nonatomic) int age;

self.age = user.age; //直接将age指针赋值给self.age

3. strong

strong是创建强引用类型的属性。在使用strong关键词定义的属性被赋值为对象时,该对象会被retain方法增加一次引用计数,当强引用类型的属性设置成nil时,对应对象的引用计数会减少1,如果其计数器变为0,则立即被销毁。

例子:

@property (strong, nonatomic) NSMutableArray *array;

self.array = [NSMutableArray array]; //增加array对象的引用计数

4. retain

retain是创建强引用类型的属性。在使用retain关键词定义的属性被赋值为对象时,该对象会被retain方法增加一次引用计数,当强引用类型的属性设置成nil时,对应对象的引用计数会减少1,如果其计数器变为0,则立即被销毁。

例子:

@property (retain, nonatomic) NSMutableArray *array;

self.array = [NSMutableArray array]; //增加array对象的引用计数

5. weak

weak是创建弱引用类型的属性。在使用weak关键词定义的属性被赋值为对象时,该对象不会被retain方法增加一个引用计数,当对象所指向的实例被销毁时,此属性的值会自动被赋值为nil。它通常用于避免循环引用问题,比如两个对象相互引用,如果都使用强引用类型,则会出现内存泄漏。

例子:

@property (weak, nonatomic) id obj;

self.obj = someObj; //不会增加someObj对象的引用计数

6. readonly

readonly关键词表示该属性只读,不可被修改。在定义属性时使用readonly关键词,则在类的其他地方无法修改该属性的值。readonly常与setter方法一起使用,setter方法用于初始化该属性的值。

例子:

@property (readonly, nonatomic) NSString *name;

7. nonatomic

nonatomic关键词是非原子性属性。当属性被声明为原子性时,表示对它的读写操作会是不可分割的,但这会对性能造成影响。而使用nonatomic关键词则表示该属性的读写操作不是原子性的,这会提高访问属性的效率。

例子:

@property (nonatomic) NSString *name;

综上所述,copy、assign、strong、retain和weak都是Objective-C语言中用于描述对象属性的关键词,各自具有不同的含义和作用。readonly和nonatomic则是用于对属性进一步限制的关键词。在实际开发中,根据需要选择不同的关键字,可以更好地管理和控制对象的内存和属性。