我是Obj-C的新手,所以我的第一个问题是:
之间有什么区别strong
,并weak
在@property
对象的指针的声明?
还有,这nonatomic
是什么意思?
我是Obj-C的新手,所以我的第一个问题是:
之间有什么区别strong
,并weak
在@property
对象的指针的声明?
还有,这nonatomic
是什么意思?
Answers:
强大的引用(在大多数情况下将使用)表示您希望“拥有”使用此属性/变量引用的对象。编译器会注意,只要您使用强引用指向它,分配给该属性的任何对象都不会被破坏。只有将属性设置为,nil
该对象才会被销毁(除非一个或多个其他对象也对该对象具有强烈的引用)。
相反,使用弱引用,则表示您不想控制对象的生命周期。您所弱引用的对象仅能生存,因为至少有另一个对象对此对象具有强引用。一旦不再是这种情况,该对象将被销毁,并且您的弱属性将自动设置为nil
。iOS中弱引用的最常见用例是:
委派属性,这些属性通常被弱引用以避免保留周期,并且
视图控制器主视图的子视图/控件,因为这些视图已经由主视图牢牢占据。
原子与非原子是指编译器为该属性综合的getter和setter方法的线程安全性。原子(默认)告诉编译器使访问器方法成为线程安全的(通过在访问ivar之前添加锁),而非原子的则相反。非原子的优点是性能略高。在iOS上,Apple几乎对所有属性都使用非原子性,因此一般建议您也这样做。
atomic
保证可以同时从多个线程安全地读取和写入该属性。这并不意味着其属性全部atomic
都是自动的线程安全的对象。
考虑气球的强引用和弱引用可能会有所帮助。
只要至少有一个人抓住气球上的绳子,气球就不会飞走。持有琴弦的人数是保留人数。当没有人抓住弦时,气球将飞走(取消分配)。许多人可以在同一气球上放绳子。您可以使用强引用和弱引用来获取/设置引用对象的属性并调用方法。
强有力的参考就像坚持那个气球的弦一样。只要您抓住气球上的绳子,它就不会飞走。
弱引用就像看着气球。您可以看到它,访问它的属性,调用它的方法,但是该气球没有任何字符串。如果所有人都松开了绳子,气球就会飞走,您将无法再使用它。
strong
和weak
真正的意思。
一个虚拟的答案:-
我认为上面的答案给出了解释,所以我只想告诉您在哪里使用STRONG
和在哪里使用WEAK
:
使用Weak
:-
1.代表团2.奥特莱斯3. 4.子视图控件等。
使用Strong
:-
保留在不包含的所有地方WEAK
。
强和弱,这些关键字围绕Objective-C中的对象所有权
什么是对象所有权?
指针变量暗示它们指向的对象的所有权。
每当指针变量指向一个对象时,该对象就会拥有所有者并保持活动状态。这被称为强参考。
变量可以选择不获取其指向的对象的所有权。不拥有对象所有权的变量称为弱引用。
在这里查看详细说明解密@property和属性
在这里,Apple文档使用各种示例解释了弱属性和强属性之间的区别:
在这里,该博客作者在同一位置收集了所有属性。这将有助于比较属性特征:
http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html
强大默认设置为。只要有很强的指针指向对象,该对象就保持“活动”状态。
弱指定了一个引用,该引用不能使引用的对象保持活动状态。如果没有对对象的强引用,则将弱引用设置为nil。
为了理解强弱参考,请考虑以下示例,假设我们有一个名为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;
在下面的代码),如下,
@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的强引用(正如我们在使用@property的接口中声明的那样)。因此,直到self.usernameView处于活动状态时,myView才会从内存中释放。
现在考虑将myName分配给弱引用的dummyNameView,self.dummyNameView = myView;
与强引用不同,弱将仅保留myView,直到存在对myView的强引用为止。请参阅以下代码以了解弱引用,
-(void)displayLocalVariable
{
UIView* myView = [[UIView alloc] init];
NSLog(@"myView tag is = %ld", myView.tag);
self.dummyNameView = myView;
}
在上面的代码中,对myView的引用较弱(即self.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;
}
在上面的代码中,self.usernameView具有对myView的强引用,因此,即使方法结束后self.dummyNameView现在也具有myView的值,因为myView具有与之关联的Strong引用。
现在,只要我们对变量进行强引用,它的保留计数就会增加一,并且直到保留计数达到0时,变量才会被释放。
希望这可以帮助。