assign,retain,copy,strong

作者: 且行且珍惜_iOS | 来源:发表于2016-03-29 22:16 被阅读260次
    assign,retain,copy,strong

    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 <Foundation/Foundation.h>
    #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

        本文链接:https://www.haomeiwen.com/subject/unmslttx.html