iOS-strong,copy,weak,assign等修饰符作用

ARC 是苹果引入的一种自动内存管理机制,会根据引用计数自动监视对象的生存周期,实现方式是在编译时期自动在已有代码中插入合适的内存管理代码以及在 Runtime 做一些优化。

1、变量标识符

在ARC中与内存管理有关的变量标识符,有下面几种:

__strong
__weak
__unsafe_unretained
__autoreleasing


__strong 是默认使用的标识符。只有还有一个强指针指向某个对象,这个对象就会一直存活。

__weak 声明这个引用不会保持被引用对象的存活,如果对象没有强引用了,弱引用会被置为 nil

__unsafe_unretained 声明这个引用不会保持被引用对象的存活,如果对象没有强引用了,它不会被置为 nil。如果它引用的对象被回收掉了,该指针就变成了野指针。

__autoreleasing 用于标示使用引用传值的参数(id *),在函数返回时会被自动释放掉。

变量标识符的用法如下:

Number* __strong num = [[Number alloc] init];
注意 __strong 的位置应该放到 * 和变量名中间,放到其他的位置严格意义上说是不正确的,只不过编译器不会报错。

2、属性标识符

类中的属性也可以加上标志符:

@property (assign/retain/strong/weak/unsafe_unretained/copy) Number* num

1、strong 表示指向并拥有该对象。其修饰的对象引用计数会增加1。该对象只要引用计数不为0则不会被销毁。当然强行将其设为nil可以销毁它。
strong表示对一块内存强引用,当strong类型的指针指向一块内存,这块内存的引用计数就加1,相反则减1。当一块内存的引用计数为0时则销毁这块内存。

2、weak 表示指向但不拥有该对象。其修饰的对象引用计数不会增加。无需手动设置,该对象会自行在内存中销毁。
weak表示一个指针对一块内存进行弱引用。弱引用就是不增加所指向内存的引用计数。

3、assign 主要用于修饰基本数据类型,如NSInteger和CGFloat,这些数值主要存在于栈上。不涉及内存管理,内存计数不变化,如果修饰对象类型的话会出现野指针或者EXC_BAD_ACCESS错误。

4、weak 一般用来修饰对象,assign一般用来修饰基本数据类型。原因是assign修饰的对象被释放后,指针的地址依然存在,造成野指针,在堆上容易造成崩溃。而栈上的内存系统会自动处理,不会造成野指针。

5、copy与strong类似。不同之处是strong的复制是多个指针指向同一个地址,而copy的复制每次会在内存中拷贝一份对象,指针指向不同地址。copy一般用在修饰有可变对应类型的不可变对象上,如NSString, NSArray, NSDictionary。

6、unsafe_unretained 类型指针指向一块内存时,内存的引用计数也不会增加,这一点与weak一致。但是与weak类型不同的是,当其所指向的内存被销毁时,unsafe_unretained类型的指针并不会被赋值为nil,也就是变成了一个野指针。对野指针指向的内存进行读写,程序就会crash。

3、其他标识符

1、@property 这个关键词的唯一作用就是声明getter、setter方法接口

2、@synthesize 实现setter、getter方法,找不到实例变量则主动创建一个

3、@dynamic 语义是用户要求自动生成setter getter方法,系统不会自动生成,所以此时调用setter或getter方法会crash,编译不报错(oc的动态绑定机制),而且调用对应的实例变量会报错

4、atomic 默认属性。当前进程进行到一半,其他线程来访问当前线程,可以保证先执行完毕当前线程。只是保证setter/getter完整,不是线程安全。atomic修饰的设值、取值方法使用了自旋锁,确保线程同步。虽然设值、取值方法是原子操作,但不代表是线程安全。

5、nonatomic 非默认属性。两个线程同时访问同一个属性将会导致无法预计的结果。优点是程序运行速度快。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值