在指向对象的指针的@property
声明中,strong
和weak
之间有什么区别?
此外,nonatomic
是什么意思?
在指向对象的指针的@property
声明中,strong
和weak
之间有什么区别?
此外,nonatomic
是什么意思?
强引用和弱引用可以通过气球来理解。
只要有至少一个人拿着系在气球上的绳子,气球就不会飞走。这里拿着绳子的人数是保留计数。当没有人拿着绳子时,气球就会飞走(被释放)。很多人可以拿着同一个气球的绳子。无论是强引用还是弱引用都可以对引用对象进行属性设置和调用方法。
强引用就像拿着气球的绳子一样。只要你拿着系在气球上的绳子,它就不会飞走。
弱引用则像是看着气球。你可以看到它,访问它的属性,调用它的方法,但你没有和气球相连的绳子。如果所有拿着绳子的人都松手了,气球就会飞走,那么你就无法再访问它了。
strong
和weak
的实际含义。 - Isurunil
时,对象才会被销毁(除非一个或多个其他对象也保持对其的强引用)。与之相反,使用弱引用表示您不想控制对象的生命周期。您弱引用的对象之所以仍然存在,是因为至少有另一个对象具有强引用。一旦不再满足这种情况,对象将被销毁,您的弱属性将自动设置为nil
。iOS中最常见使用弱引用的情况是:
atomic
保证了一个属性可以在多个线程同时读写时被安全地访问,但这并不意味着所有属性都是atomic
的对象自动具备线程安全性。 - Ole Begemannstrong:将传入的值分配给它,它将保留传入的值并释放实例变量的现有值。
weak:将分配传入的值但不会保留它。
因此,基本区别在于新变量的保留。通常您想要保留它,但有些情况下您不希望这样做,否则会出现保留循环并且无法释放对象的内存。例如,obj1 保留 obj2 并且 obj2 保留 obj1。为解决这种情况,使用弱引用。
一份虚假的答案 :-
我认为上面的答案已经解释得很清楚了,所以我只是告诉你何时使用STRONG
和何时使用WEAK
:
使用Weak
:-
1. 代理
2. 插座
3. 子视图
4. 控件等。
使用Strong
:-
除了 WEAK
未包括在内的所有其他地方。
strong 是默认值。只要有强引用指向一个对象,它就会保持“存活”状态。
weak 指定的引用不会使引用的对象保持存活状态。当没有强引用指向对象时,弱引用将被设置为 nil。
-(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;
}
在上面的代码中,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;
}