Objective-C——屬性與成員變數辨析

來源:互聯網
上載者:User

標籤: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——屬性與成員變數辨析

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.