assign,retain,copy,strong

assign,retain,copy,strong_第1张图片
图片发自App

assign用于简单数据类型,如NSInteger,double,bool,

retain和copy用于对象,

readwrite是可读可写特性;需要生成getter方法和setter方法时

readonly是只读特性 只会生成getter方法 不会生成setter方法 ;不希望属性在类外改变

assign是赋值特性,setter方法将传入参数赋值给实例变量;仅设置变量时;

retain表示持有特性,setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1;retain是在同一块内存地址操作,而copy是重新复制了新的一快内存地址;

copy表示赋值特性,setter方法将传入对象复制一份;需要完全一份新的变量时。

strong:强引用,arc中使用,与mrc中retain类似,使用之后,引用计数+1;实例变量对传入的对象有所有权,即强引用。strong根retain的意思相同并产生相同的代码,语意上更能体现对象的关系;

weak:弱引用,arc中使用,如果传入的对象被释放了,其指向nil,可以有效的避免野指针,其引用计数为1;

说到底,strong 和copy 其实就是不同的修饰符,对应不同的setter方法,

  1. strong对应的setter方法,是将_property先release(_property release),然后将参数retain(property retain),最后是_property = property。
  2. copy对应的setter方法,是将_property先release(_property release),然后拷贝参数内容(property copy),创建一块新的内存地址,最后_property = property。

copy赋值时会开辟一个新的内存区域,而 strong 则不会。使用 copy 可以防止不可变的属性被赋值的是可变的数据时,因为可变数据的改变而改变属性的值。

@interface Test : NSObject
@property (nonatomic,strong) NSString *str1;
@property (nonatomic,copy) NSString *str2;
@end

#import 
#import "Test.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
    NSMutableString *str = [NSMutableString stringWithString:@"hello"];
    Test *test = [[Test alloc]init];
    test.str1 = str;
    test.str2 = str;
    [str appendString:@" world"];
    NSLog(@"str:%@ str1:%@ str2:%@",str,test.str1,test.str2);
}
return 0;
}

这段代码的输出结果是: str:hello world str1:hello world str2:hello
copy的作用应该显而易见了.

nonatomic非原子操作,决定编译器生成的setter getter是否是原子操作,atomic表示多线程安全,一般使用nonatomic.

你可能感兴趣的:(assign,retain,copy,strong)