Objective-C中的强弱之间的差异
我是Obj-C的新手,所以我的第一个问题是:
在指向对象的@property
声明中, strong
和weak
之间有什么区别?
另外, nonatomic
是什么意思?
一个强大的引用(在大多数情况下你会使用它)意味着你想用你的属性/variables“拥有”你引用的对象。 编译器会小心的是,只要你指向一个强引用,你分配给这个属性的任何对象都不会被销毁。 只有当你将属性设置nil
时,对象才会被销毁(除非一个或多个其他对象也拥有强大的引用)。
相反,如果引用较弱,则表示您不想控制对象的生命周期。 因为至less有一个其他对象对它有强烈的引用,所以你所引用的对象很弱。 一旦不再是这种情况,对象被破坏,你的弱财产将自动设置nil
。 iOS中最常见的弱引用用例是:
-
委托属性,通常被弱引用以避免保留周期
-
视图控制器主视图的子视图/控件,因为这些视图已经被主视图牢牢占据。
atomic与nonatomic是指编译器为属性合成的getter和setter方法的线程安全性。 atomic(默认值)告诉编译器使访问器方法成为线程安全的(通过在访问ivar之前添加锁),nonatomic则相反。 非primefaces的优点是性能略高。 在iOS上,苹果几乎所有的属性都使用非primefaces,所以一般的build议是你也这样做。
从气球angular度考虑强和弱的参考可能是有帮助的。
只要至less有一个人握着一根绳子,气球就不会飞走。 持有string的人数是保留计数。 当没有人握住绳子时,气球就会飞走(dealloc)。 许多人可以有相同的气球string。 您可以使用强和弱引用来获取/设置引用对象的属性和调用方法。
一个强有力的参考就像持有该气球的string。 只要你坚持一个连接到气球的string,它不会飞走。
一个弱点就像看着气球。 你可以看到它,访问它的属性,调用它的方法,但你没有string的气球。 如果每个人都抓着绳子走,气球就飞走了,你再也不能接近它了。
强 :将传入值赋给它,它将保留传入值并释放实例variables的现有值
弱 :将分配给它的值,而不保留它。
所以基本的区别是保留新的variables。 一般来说,你想保留它,但有些情况下你不想拥有它,否则你将得到一个保留周期,不能释放内存的对象。 例如。 obj1保留obj2,obj2保留obj1。 为了解决这种情况,你使用弱引用。
这些关键字围绕着Objective-C中的对象所有权而展开
什么是对象所有权?
指针variables意味着它们指向的对象的所有权。
- 当一个方法(或函数)有一个局部variables指向一个对象时,该variables被认为拥有被指向的对象。
- 当一个对象有一个实例variables指向另一个对象时,带有指针的对象被认为拥有指向的对象。
任何时候一个指针variables指向一个对象,该对象有一个所有者,并将保持活着。 这被称为强有力的参考。
一个variables可以不select它指向的对象的所有权。 不接受对象所有权的variables称为弱引用。
虚拟答案:
我想在上面的答案给出解释,所以我只是要告诉你在哪里使用STRONG
和在哪里使用WEAK
:
使用Weak
: – 1.代表2.sockets3.子视图4.控件等
使用Strong
: –剩余的地方不包括在WEAK
。
在这里, 苹果文档使用各种示例解释了弱势与强势的区别:
在这里,在这个博客作者收集了所有的属性在同一个地方。 这将有助于比较属性的特点:
http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html
强是默认的。 只要有一个强有力的指针,一个对象仍然是“活着的”。
弱指定一个引用,不保持被引用的对象活着。 当没有强引用时,弱引用设置为零。
新的ARCtypes分别替代保留和赋值。 代表和网点应该薄弱。 一个强有力的参考是对一个对象的引用,它阻止它被释放。 换句话说,它创build了一个所有者关系。 弱引用是指一个对象不会阻止它被释放。 换句话说,它不创build所有者关系。
简而言之:
强壮是替代retain属性,作为Objective-C自动引用计数(ARC)的一部分。 在非ARC代码中,它只是保留的同义词。
弱
弱类似于强类似,只是它不会将引用计数增加1.它不会成为该对象的所有者,而仅仅是对它的引用。 如果对象的引用计数下降到0,即使您仍然可以在这里指向它,它将从内存中解除分配。
新的ARCtypes分别替代保留和赋值。 代表和网点应该薄弱。
强大
一个强大的引用是对一个对象的引用,阻止它被释放。 换句话说,它创build了一个所有者关系。
弱
弱引用是指一个对象不会阻止它被释放。 换句话说,它不创build所有者关系。
强 :基本上用于我们用来从其他类获取或发送数据的属性。 弱 :通常所有的sockets,连接都是弱接口的。
非primefaces性 :这种types的属性用于我们不想将我们的出口或对象分成不同的同时线程的情况。 换句话说,Nonatomic实例使我们的属性一次处理一个线程。 希望对你有帮助。
- 为什么UIViewController在UINavigationBar下扩展,而UITableViewController没有?
- UIImageView在设备上启动屏幕上丢失的图像
- 无法closuresMFMailComposeViewController,委托没有被调用
- iOS 10中的错误:无法从https://mesu.apple.com/assets/中复制资产types的资产信息
- 如果用户点击屏幕键盘,我怎样才能closures键盘?
- 我可以在Objective-C中重载一个操作符吗?
- UIImagePickerController中的前置摄像头
- iPhone正确使用应用程序委托
- NSTimeInterval到HH:mm:ss?