应用的场景是在开发中使用了单选按钮-----在tableView上添加单选按钮操作,即点击就可以选中相应的操作,具体的界面展示如下:
这种情况下在iPhone 上展示选择并未有什么问题,但是当应用运行在iPad上的时候就会出现如下错误:
错误的原因很明显就是引用了已经释放掉的资源,这个资源就是:
设置了它的类型属性为assign 对象不会被持有,就导致了一个悲剧,在ipad上就崩溃了【iOS版本9.3.5】 直接将assign的属性
改成strong 就解决了这个问题----------原因:这个是因为assign可以指向被释放掉的内存, 修饰的对象为弱引用,参数对象的引用指针不会增加,
这样对象本身的作用是记录不同的对象的点击位置,当其指针不会改变时 空指针的问题,形成了崩溃。
copy/retain/strong/assign/weak 都是对内存管理有影响的关键字
1.copy NSString、block、可变的对象类型(NSMutableString、NSMutableArray、NSMutableDictionary等)
2.retain可以在MRC/ARC环境中用于修饰对象类型的属性,当调用setter方法时,参数对象的引用指针会增加 1
3.strong 在ARC环境中用于修饰对象类型的属性 当调用setter方法时,参数对象的引用指针会增加 1
4.assign 在MRC/ARC环境中,用于修饰基本数据类型或对象类型的属性;修饰对象类型的属性时表示弱引用,虽然可以使用参数对象,但是参数对象的引用指针不会增加
5.weak 在ARC环境中使用,修饰对象类型,表示弱引用,虽然可以使用参数对象,但是参数对象的引用指针不会增加
retain 和 strong的区别:strong修饰的属性所指向的对象,当这个被引用的对象的引用计数(retainCount)为0时,系统会自动将对象对应的指针 置为 nil,并释放对应的内存空间,而retain修饰的是不会的,容易造成野指针,引起不明的崩溃 ,strong比retain 安全,但是只能在ARC环境使用
assign 和 weak : 使用weak修的属性所指向的对象,引用计数为0以后,系统会将对象的指针置nil,assign修饰的属性时不会进行这个操作的,容易造成野指针,引起不明的崩溃 ,weak只能在ARC中使用,且weak不能修饰基本数据类型