標籤: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);}@end
main.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; [email protected]"sds"; [class print]; } return 0;}
Objective-C——屬性與成員變數辨析