標籤:
一. 點文法點文法的本質是方法調用,並不是訪問成員變數,編譯器看到點文法有兩種處理
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成員變數的範圍