首页 > 代码库 > Objective-C——属性与成员变量辨析
Objective-C——属性与成员变量辨析
上篇中提过,成员变量是在一对大括弧里面声明的;而属性是用先@property声明再用@synthesize合成的。属性是oc语言的一个新的机制,在实际的使用中这两者还是有不少区别的。
类中的成员变量,通过权限修饰符@protected、@private、@public更该它的被访问权限,而属性是属于类的对象的,通过生成一个该类的对象我们就可以获得它的访问权。
FirstClass.h
<span style="font-size:12px;">#import <Foundation/Foundation.h> @interface FirstClass : NSObject { //类的成员变量,默认访问权限为protect int m;</span>
<span style="font-size:12px;">} //+表示类方法 +(void)classFun; //-表示实例方法 -(id)initWithName:(NSString *)aName andNum:(int )n; -(void)print; @property(nonatomic,strong)NSString *name; @property(nonatomic,assign)int count; @end</span><span style="font-size:14px;"> </span>
在头文件中声明了(NSString *)name和(int )count两个变量,@property声明变量时会自动的为我们生成以下划线开头的实例变量_name,及_count.并生成他们的setter和getter方法。当在FirstClass.m实现文件中省略@synthesize合成属性时,编译器自动生成_name和_count两个实例变量。
<span style="font-size:14px;"> //self.name访问对象的属性,_name是name的实例可直接使用,也即self.name=_name;</span>
当然这也不是说@synthesize没有作用,@synthesize variable=xxx,此时self.variable的实际操作对象为xxx而不是_variable;
当我们在实现文件中
@synthesize name;
编译器会自动生成name的实例变量,以及它相应的setter和getter方法。注意此时生成的实例变量就是name.而不是_name.
OC中"."与"->"的区别
OC中对象的操作都是通过指针调用实现的,所有的成员变量都可以通过"->"来获取。
“.”操作符在之前的OC版本中是没有的,为了适应JAVA/C++等程序员的使用习惯后来新加入的特性。"."在OC中实际上是方法的调用。
</pre></p><p style="margin-top: 0px; margin-bottom: 0px; font-family: Menlo;"><pre name="code" class="objc">self.name=aName;<span style="font-family: Menlo;">//.语法放在等号左边相当于调用setter方法</span>
NSLOg(@"%@",self.name);//.语法放在等号右边相当于调用getter方法
下面是测试上面范例的代码
FirstClass.h
// // FirstClass.h // 类属性方法成员变量 // // Created by student on 14-9-17. // Copyright (c) 2014年 codebat. All rights reserved. // #import <Foundation/Foundation.h> @interface FirstClass : NSObject { //类的成员变量,默认访问权限为protect @public int m; } //+表示类方法 +(void)classFun; //-表示实例方法 -(id)initWithName:(NSString *)aName andNum:(int )n; -(void)print; @property(nonatomic,strong)NSString *name; @property(nonatomic,assign)int count; @end
FirstClass.m
// // FirstClass.m // 类属性方法成员变量 // // Created by student on 14-9-17. // Copyright (c) 2014年 codebat. All rights reserved. // #import "FirstClass.h" @implementation FirstClass @synthesize name;//此时仅生成name实例,_name不可用 @synthesize count=_count;//指定实例变量为_count,这句话省略效果一样 +(void)classFun { NSLog(@"类方法"); } -(id)initWithName:(NSString *)aName andNum:(int )m { if(self=[super init]) { self.name=aName; _count=m; } return self; } -(void)print { NSLog(@"%@ %d",self.name, self.count); } @endmain.m
// // main.m // 类属性方法成员变量 // // Created by student on 14-9-17. // Copyright (c) 2014年 codebat. All rights reserved. // #import <Foundation/Foundation.h> #import "FirstClass.h" int main(int argc, const char * argv[]) { @autoreleasepool { FirstClass *class=[[FirstClass alloc]initWithName:@"doubi" andNum:21]; class->m=20; class.count=22; class.name=@"sds"; [class print]; } return 0; }
Objective-C——属性与成员变量辨析