Objective-C成员变量声明方式探究

一、@interface和 @property 方式声明变量的区别

1.你可以单独在@interface中定义变量,而不用@property定义;也可以只用@property去定义,而不在@interface中定义,当然用了@property去定义,一般要在.m文件中用@synthsize去合成相应的setter,getter方法。否则会得到一个警告。

2.那这两种方式有什么区别呢。
(1)只在@interface中定义变量的话,你所定义的变量只能在当前的类中访问,在其他类中是访问不了的;而用@property声明的变量可以在外部访问。
(2)用了@property去声明的变量,可以使用“self.变量名”的方式去读写变量。而用@interface的方式就不可以。

二、存取器和变量

1.问题:我们在进行iOS开发时,经常会在类的声明部分看见类似于下面的情况:
  @property (strong, nonatomic) UIWindow *window; 
  @synthesize window = _window; 的语句,
  那么,这个window是什么,_ window又是什么?

2.答案和解释:
(1)@synthesize window = _window; 意思是说,window 属性为 _window 实例变量合成访问器方法。
(2)更具体的解释:根据上面语句,编译器生成的存取方法应该是:setWindow和getWindow。但是存取方法操作的变量是_window,实际上操作的变量始终是_window。
(3)根据上面的语句,编译器会自动生成一个_window成员变量。如果现在在@interface中再显示声明一个_window成员变量,实际上效果是一样的。但是如果在@interface中添加一个window成员变量,会同时存在window和_window两个成员变量,其中_window可以被外部访问,而window不能。
(4)如果这样写:@synthesize window;则编译器生成的存取器名称和变量名是一致的,编译器会自动生成window变量,如果此时同时在@interface中添加window成员变量,效果也是一样。

3.通过这个看似是赋值的这样一个操作,我们可以在@synthesize中定义与变量名不相同的getter和setter的命名,借此来向外部隐藏成员变量,防止被不正常使用,规范使用者使用存取器来操作变量。

4.通过以上分析,做一下使用总结:
(1)如果要建立一个私有变量,不对外公开,则将变量声明在@interface中,不写@property和@synthesize。
(2)如果要建立一个公开的变量,则使用@property和@synthesize来声明变量,不用再在@interface中声明变量,因为变量是自动生成的。如果要让变量名和存取器名不一致,以此来隐藏变量,则使用类似@synthesize window = _window;的代码。

5.默认的getter的方法名是和变量名一样的,当我们的变量是一个形容词的时候,比如是否可见,visible,setter方法名为setVisible,getter方法名为visible,而我们希望getter方法名为isVisible,则可以使用下面的方式:@property(nonatomic,getter=isVisible) BOOL visible;同样的也可以设置setter方法名,示例:@property(nonatomic,setter=setVisible:) BOOL visible;

三、在实现文件中声明全局变量

1.示例代码:
@implementation Fraction{
   int  numerator;
   int  denominator;
}

2.类似于在实现文件中声明的方法一样,声明的变量为私有变量。

四、XCode4.5新特性

1.在xcode4.5以前,当我们想为类添加一个新的公开属性,一般都要写@property和@synthesize,但是在Xcodexi4.5之后,synthesize现在会对应property自动生成。

2.默认行为下,对于属性foo,当没有写相应的synthesize的时候,编译器会自动补全synthesize,方式如下:@synthesize foo = _foo。也就是说,默认的变量名是_xxxxx,如果不希望这样,就只能手动写synthesize了,比如:@synthesize foo;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值