前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >assign,retain,copy,strong

assign,retain,copy,strong

作者头像
且行且珍惜_iOS
发布2018-05-22 16:52:45
6000
发布2018-05-22 16:52:45
举报

图片发自简书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 可以防止不可变的属性被赋值的是可变的数据时,因为可变数据的改变而改变属性的值。

代码语言:javascript
复制
@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.

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016.03.29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档