我是Obj-C的新手,所以我的第一个问题是
在对象指针的@property声明中,strong和weak之间有什么区别?
@property
strong
weak
还有,nonatomic是什么意思?
nonatomic
<强大的>强大的强大的>:将传入值赋给它,它将保留传入值并释放实例变量的现有值
弱:将传入值赋给它而不保留它。
强引用(在大多数情况下都会用到)意味着你想“拥有”你用这个属性/变量引用的对象。编译器会注意,只要您使用强引用指向该属性,那么分配给该属性的任何对象都不会被销毁。只有当你将属性设置为nil时,对象才会被销毁(除非一个或多个其他对象也持有对它的强引用)。
nil
相反,使用弱引用表示您不想控制对象的生命周期。弱引用的对象只能继续存在,因为至少有一个其他对象持有对它的强引用。一旦不再是这种情况,对象将被销毁,你的弱属性将自动被设置为nil。在iOS中,弱引用最常见的用例是:
委托属性(通常弱引用以避免保留周期)和
视图控制器的主视图的子视图/控件,因为那些视图已经被主视图强持有。
原子与非原子指的是编译器为属性合成的getter和setter方法的线程安全性。Atomic(默认值)告诉编译器使访问器方法是线程安全的(通过在访问ivar之前添加锁),而nonatomic则相反。非原子的优点是性能略高。在iOS上,苹果几乎所有的属性都使用nonatomic,所以一般建议你也这么做。
这里,苹果公司的文档用不同的例子解释了弱属性和强属性之间的区别:
https://developer.apple.com/library/ios/documentation/cocoa/conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html#//apple_ref/doc/uid/TP40011210-CH5-SW3
在这里,在这个博客作者收集了所有的属性在同一个地方。这将有助于比较属性特征:
http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html
从气球的角度考虑强引用和弱引用可能会有所帮助。
只要至少有一个人抓住系在气球上的绳子,气球就不会飞走。持有字符串的人数是保留计数。当没有人抓住绳子时,气球就会飞走(dealloc)。许多人都可以拥有同一个气球的绳子。您可以通过强引用和弱引用在被引用的对象上获取/设置属性和调用方法。
强引用就像抓住气球上的一根绳子。只要你抓住系在气球上的绳子,它就不会飞走。
一个弱的参考就像在看气球。你可以看到它,访问它的属性,调用它的方法,但你没有那个气球的字符串。如果每个人都松开绳子,气球就飞走了,你就再也碰不到它了。
<强大的>强大的强大的>是默认值。一个对象只要有一个强指针指向它,它就会保持“活动”。
弱指定了一个引用,该引用不保持被引用对象的活动状态。当没有对对象的强引用时,弱引用被设置为nil。
<强大的>强大的强大的>和弱,这些关键字在Objective-C中围绕着对象所有权
什么是对象所有权?
指针变量意味着它们所指向的对象的所有权。
每当指针变量指向一个对象时,该对象就有一个所有者,并且将保持活动状态。这被称为<强大的>强大的强大的>引用。
变量可以选择不拥有它所指向的对象。不拥有对象所有权的变量称为弱引用。
这里有一个详细的解释揭秘@property和attributes
一个虚假的回答:-
我想上面的答案中已经给出了解释,所以我只想告诉你在哪里使用STRONG和在哪里使用WEAK:
STRONG
WEAK
Weak的使用:- 1. 代表 2. 网点 3.子视图 4. 控制等。< / p >
Weak
Strong的使用:- 保留在WEAK中不包含的所有位置
Strong
强大的:基本用于属性,我们用来从/发送数据到另一个类。 Weak:通常所有的outlet,从Interface的连接都是Weak类型。
原子:当我们不希望将我们的出口或对象共享到同时存在的不同线程时,就会使用这种类型的属性。换句话说,原子实例使我们的属性一次处理一个线程。
为了理解强引用和弱引用,考虑下面的例子,假设我们有一个名为displayLocalVariable的方法。
-(void)displayLocalVariable { UIView* myView = [[UIView alloc] init]; NSLog(@"myView tag is = %ld", myView.tag); }
在上述方法中,myView变量的作用域仅限于displayLocalVariable方法,一旦方法完成,持有UIView对象的myView变量将从内存中释放。
如果我们想在视图控制器的整个生命周期中保持myView变量。为此,我们可以创建名为usernameView的属性,该属性将具有对变量myView的强引用(参见下面代码中的@property(nonatomic,strong) UIView* usernameView;和self.usernameView = myView;),如下所示:
@property(nonatomic,strong) UIView* usernameView;
self.usernameView = myView;
@interface LoginViewController () @property(nonatomic,strong) UIView* usernameView; @property(nonatomic,weak) UIView* dummyNameView; - (void)displayLocalVariable; @end @implementation LoginViewController - (void)viewDidLoad { [super viewDidLoad]; } -(void)viewWillAppear:(BOOL)animated { [self displayLocalVariable]; } - (void)displayLocalVariable { UIView* myView = [[UIView alloc] init]; NSLog(@"myView tag is = %ld", myView.tag); self.usernameView = myView; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } @end
现在在上面的代码中,你可以看到myView已经被分配给self。usernameView和self。usernameView具有对myView的强引用(正如我们在interface中使用@property声明的那样)。因此,myView直到self才会从内存中被释放。usernameView是活的。
现在考虑将myName分配给dummyNameView,这是一个弱引用,self.dummyNameView = myView;与强引用不同,弱引用只会保留myView,直到有对myView的强引用。请参阅下面的代码以理解弱引用,
self.dummyNameView = myView;
-(void)displayLocalVariable { UIView* myView = [[UIView alloc] init]; NSLog(@"myView tag is = %ld", myView.tag); self.dummyNameView = myView; }
在上面的代码中,有对myView的弱引用(即。自我。dummyNameView有对myView的弱引用),但没有对myView的强引用,因此是self。dummyNameView将不能保存myView的值。
现在再次考虑下面的代码,
-(void)displayLocalVariable { UIView* myView = [[UIView alloc] init]; NSLog(@"myView tag is = %ld", myView.tag); self.usernameView = myView; self.dummyNameView = myView; }
在以上代码中自我。usernameView有一个对myView的强引用,因此是self。即使在方法结束后,dummyNameView现在也会有一个myView的值,因为myView有一个与之关联的强引用。
现在,每当我们对一个变量进行强引用时,它的保留计数会增加1,直到它的保留计数达到0,变量才会被释放。
希望这能有所帮助。