对象指针的@property声明中强属性和弱属性的区别是什么?
还有,非原子是什么意思?
对象指针的@property声明中强属性和弱属性的区别是什么?
还有,非原子是什么意思?
当前回答
为了理解强引用和弱引用,考虑下面的例子,假设我们有一个名为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;和自我。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的强引用。请参阅下面的代码以理解弱引用,
-(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,变量才会被释放。
希望这能有所帮助。
其他回答
为了理解强引用和弱引用,考虑下面的例子,假设我们有一个名为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;和自我。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的强引用。请参阅下面的代码以理解弱引用,
-(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,变量才会被释放。
希望这能有所帮助。
从气球的角度考虑强引用和弱引用可能会有所帮助。
只要至少有一个人抓住系在气球上的绳子,气球就不会飞走。持有字符串的人数是保留计数。当没有人抓住绳子时,气球就会飞走(dealloc)。许多人都可以拥有同一个气球的绳子。您可以通过强引用和弱引用在被引用的对象上获取/设置属性和调用方法。
强引用就像抓住气球上的一根绳子。只要你抓住系在气球上的绳子,它就不会飞走。
一个弱的参考就像在看气球。你可以看到它,访问它的属性,调用它的方法,但你没有那个气球的字符串。如果每个人都松开绳子,气球就飞走了,你就再也碰不到它了。
Strong是默认值。一个对象只要有一个强指针指向它,它就会保持“活动”。
Weak指定一个引用,该引用不保持被引用对象的活动状态。当没有对对象的强引用时,弱引用被设置为nil。
强:主要用于属性,我们用来从/发送数据到另一个类。 弱:通常所有的出口,连接从接口弱类型。
原子的:这种类型的属性在不希望将我们的出口或对象共享到同时存在的不同线程的情况下使用。换句话说,原子实例使我们的属性一次处理一个线程。 希望对你们有帮助。
Strong:将传入值赋给它,它将保留传入值并释放实例变量的现有值
弱:将传入值赋给它而不保留它。
所以基本的区别是保留了新变量。 一般来说,你想要保留它,但也有你不想要它的情况,否则你会得到一个保留周期,不能释放对象的内存。如。Obj1保留obj2 obj2保留Obj1。要解决这种情况,可以使用弱引用。