为了账号安全,请及时绑定邮箱和手机立即绑定

属性(property)与成员变量(ivar)有什么区别

属性(property)与成员变量(ivar)有什么区别

GCT1015 2019-04-06 16:57:38
最近看了很多别人写的example,一直搞不懂为什么很多人同时写属性和成员变量如下:@interfaceKKProgressToolbar:UIToolbar{@privateid__weak_actionDelegate;UIBarButtonItem*_stopButtonItem;UIActivityIndicatorView*_activityIndicator;UILabel*_statusLabel;UIProgressView*_progressBar;}@property(nonatomic,strong)UIBarButtonItem*stopButtonItem;@property(nonatomic,strong)UIActivityIndicatorView*activityIndicator;@property(nonatomic,strong)UILabel*statusLabel;@property(nonatomic,strong)UIProgressView*progressBar;@property(nonatomic,weak)idactionDelegate;一般我自己写的时候,直接写@property,然后在m文件中,写上@synthesizeaaaaa=_aaaaa;我刚开始学IOS,不知道这个的区别是什么,望有人不嫌弃,指点一二,在此谢过!!!
查看完整描述

2 回答

?
红糖糍粑

TA贡献1815条经验 获得超6个赞

成员变量主要是适用于iOS5之前的开发,需要程序员手动进行内存管理。iOS5之后(包括iOS5)引入了ARC(AutomaticReferenceCounting)同过在property中使用strong,weak等标记自动对内存进行管理。也就是说进行iOS5及以后系统版本的开发,可以放心的使用property,而无需对其进行手动的内存管理。
                            
查看完整回答
反对 回复 2019-04-06
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

声明了@property并@synthesize后编译器会为你的实例变量生成getter和setter,这些方法会遵循你声明的内存管理的语义,在set的时候执行对应的操作,比如retain,copy等;但它们是方法,而不是变量,所以obj.foo=@"a"其实是一个语法糖,等同于[objsetFoo:@"a"]。在过去你还需要声明对应的实例变量,并通过@synthesizefoo=_foo的方式建立和它们之间的关系,但新的Clang编译器会默认帮你加入@synthesize的步骤,默认实例变量形式为property名加下划线。但是你依然可以声明实例变量,并手动建立和property的关系,尤其是实例变量的形式与默认的不同,比如:@synthesizefoo=_bar。一般的情况下你应该多用@property,因为它可以进行某种程度的自动内存管理(根据你声明时的语意义),但是由于getter和setter本质上是普通的方法,所以它们可以被覆盖,可以执行除了get和set额外的操作(副作用),所以在某些情况下(比如init...和dealloc方法里)你会手动去进行赋值。同理,由于@property声明的是方法,你可以不必有对应的实例变量,而是自行实现一个getter和setter执行自定义的操作。有时候你甚至不用去声明对应的实例变量和getter/setter,因为它们在父类已经存在,或者在运行时才存在,那么这时候你会用到@dynamic而不是@synthesize,不然编译器会报错。关于使用实例变量还是@property,其实和用不用ARC没有太多关系。。。,它们也不是互相替代的关系
                            
查看完整回答
反对 回复 2019-04-06
  • 2 回答
  • 0 关注
  • 410 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号