欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > > 内容正文

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

来源: 开发者 投稿于  被查看 23976 次 评论:21

Objective-C成员变量声明方式探究,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;

相关文章

    暂无相关文章

用户评论