Objective-C基礎學習筆記(六)-property作用-構造方法-OC成員變數的範圍

來源:互聯網
上載者:User

標籤:

一. 點文法點文法的本質是方法調用,並不是訪問成員變數,編譯器看到點文法有兩種處理

1 .是賦值,賦值的就是展開為set方法

2. 不是賦值:展開為set方法

使用樣本:

Person類的聲明:

 

點文法的測試:

二. OC成員變數的範圍

@public :任何地方訪問@private :只能在當前類的對象方法中直接存取@protected :能在當前類和子類中直接存取(預設)@package :只要處於同一個架構中就能直接存取對象成員變數  

三. @property 與 @synthesize

由於類的封裝性,要求我們要自己給外部提供一些方法去訪問我們的成員變數,這方法在OC中就是set或get方法,但由於set或get方法格式固定,且如果成員變數過多,寫起來很花費時間且沒有太大的協助,於是就有了下面的兩個關鍵字協助我們完成set和get方法:1. @property1) 用在@interface 中2)用來自動產生setter和getter3) @propertyint age;就可以替換下面兩行   - (void)setAage:(int)age;   - (int)age; 2. @synthesize   1> 用在@implementation中   2> 用來自動產生自動產生set和get方法實現   3>  用@synthesize age = _age;就可以替代
1  - (int)age2 {3     eturn _age;4 }5 - (void)setAge:(int)age6 {7     _age = age; 8 }

 

 說明:xcode4.幾以後@property獨攬了@synthesize功能即@property可同時產生 set和get方法的聲明和實現,成員變數都不用聲明,缺點是成員變數私人,要自己加成員變數 protect @property使用樣本:Person類的聲明:
 1 #import <Foundation/Foundation.h>   2    3 @interface Person : NSObject   4    5 // @property 可自動產生某個成員的set和get聲明   6 // 成員變數名不能加 _   7 // 如果成員變數不存在,則會自動產生 private類型   8 @property int age;   9 //- (void)setAage:(int)age;  10 //- (int)age;  11 @end 

 

Person類的實現:
測試:
#import <Foundation/Foundation.h>  #import "Person.h"  int main(int argc, const charchar * argv[])  {          Person *p = [Person new];          /* 點文法的使用 */          p.age = 5;          NSLog(@"p.age %d ",p.age);        return 0;  } 

 

set[762:52529] p.age 5 

手動實現的情況1)若手動實現了set方法,編譯器只會自動產生get 方法2)若手動實現了get方法,編譯器只會自動產生set 方法3)若手動同時實現了set方法和get方法,編譯器不會自動產生不存在的成員變數原則: 你有的我就不幫你實現,你實現了get我就只產生set;如果你實現了set 和get 則不會產生成員變數。  四.id簡介:1. 萬能指標,指向任何OC對象,相當於NSObject *2. id 類型定義
1 typedef struct obj object{2      Class isa;3 }*id;
使用樣本:id p = [Person new];局限性:調用一個不存在的方法,編譯器馬上報錯。 五.OC構造方法:  1.什麼是構造方法,構造方法是用來幹什麼的,為什麼要有構造方法?  構造方法是用來初始化對象的方法,以- 開頭,由於使用new方法建立的對象,對象的成員的初始值都為0,這在開發中很不方便,經常要在建立對象時就初始化好一些屬性的值,所以使用這個構造方法可以滿足這個需求。 2.使用系統內建的new建立對象的過程:[Person new];完整的建立一個可用對象,new做什麼事情,調用兩個方法    1.分配儲存空間(一個對象)+alloc    2.初始化      -init 方法完成初始化,這過程通常是將成員的屬性設定為0。3.不使用new,自己建立對象的方法: 
/* 1. 調用 +alloc 分配儲存空間 */  //Person *p1 = [Person alloc];    /* 2. 調用 - init進行初始化 */  //Person *p2 = [p1 init];    // 直接一句話搞定 開發中常用,初始化自己的值    Person *p3 = [[Person alloc] init];  

 

4.如何使用構造方法設定對象成員的初始值? 現有一個需求:每個Person對象建立出來,他的_age都是10;思路一: 重寫 -init 方法:重寫-init 方法樣本:Person類的定義
#import <Foundation/Foundation.h>    @interface Person : NSObject    @property int age;    @end  
Person類的實現重寫父類的init方法,將_age初始化為10
 1 @implementation Person   2    3 /* 重寫 -init 方法 */   4 - (id)init   5 {   6     // 1.一定要調用super的init方法:初始化父類中聲明的一些成員變數   7        8     // 2.如果對象初始化成功,才有必要進行接下來的初始化   9     // 為保證初始化之後返回的是正確的  10     if (self = [super init])  11     {// 初始化成功  12         _age = 10;  13     }  14       15     // 3. 返回一個已經初始化完畢的對象  16     return self;  17 }  18   19 @end  

 

測試代碼:
1 int main()  2 {     3     /* 需求每個Person對象建立出來,他的_age都是10 */  4     // Person *p = [[Person alloc] init];  5     NSLog(@"p age %d",p.age,);      6     return 0;  7 }  

2015-03-23 14:09:43.375 構造方法[917:81284] p age 10 

思路二: 自訂構造方法,自訂構造方法:兩部分-聲明和實現 自訂構造方法規範:1. 一定是對象方法2. 傳回值是id類型3. 方法名以init 開頭使用樣本:

Person類的聲明:自訂構造方法使用者佈建名字和年齡

#import <Foundation/Foundation.h>    @interface Person : NSObject  {      NSString *_name;      int _age;  }  @property NSString *name;  @property int age;    // 自訂構造方法:兩部分 聲明和實現  /*     自訂構造方法規範:     1.一定是對象方法     2.傳回值是id類型     3.方法名以init 開頭  */  - (id)initWithName:(NSString *)name andAge:(int)age;  @end  
Person類實現
#import "Person.h"    @implementation Person  - (id)initWithName:(NSString *)name andAge:(int)age  {      /* 無論自己寫還是改寫 都必須執行父類初始化 */      if(self = [super init])      {          _name = name;          _age = age;      }      return self;  }  @end  

 

測試代碼:
#import "Person.h"  #import "Student.h"  int main()  {      /* 使用自訂構造方法初始化person對象的名字和年齡*/      Person *p = [[Person alloc] initWithName:@"mike" andAge:18];      NSLog(@"name %@ age %d",p.name,p.age);      return 0;  
}

2015-03-23 14:20:15.727 自訂構造方法[966:85096] name mike age 18

總結:構造方法就是用來初始化成員變數的,成員變數屬於父類就在父類中初始化。

Objective-C基礎學習筆記(六)-property作用-構造方法-OC成員變數的範圍

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.