標籤:
每一個執行個體變數定義兩個方法:設定變數的setter方法 擷取變數值的getter方法
set方法的書寫規範
set方法一定是一個對象方法
set方法一定不能有傳回值
set方法必須以set開頭
set之後跟的是 執行個體變數去掉底線,並且首字母大寫
set方法一定有參數,而且參數的類型和執行個體變數的類型一致
set方法的形參名 一般是 去掉下環線的執行個體變數名
形參名不能和 執行個體變數名同名
set方法實現中,一定要用形參給執行個體變數賦值
get方法的書寫規範
get方法一定是一個對象方法
get方法一定有傳回值,傳回值的類型和執行個體變數的類型要一致
get方法的方法名 是去掉下環線的執行個體變數名
get方法一定沒有參數
get方法的實現中,一定是返回執行個體變數值
下面示範set和get方法的代碼
我們建立一個Person類在.h檔案中的代碼如下:
#import <Foundation/Foundation.h>@interface Person : NSObject{ NSString *_name; int _age;}// 成員變數_name的setter方法和getter方法的聲明- (void)setName:(NSString *)name;- (NSString *)name;// 成員變數_age的setter方法和getter方法的聲明- (void)setAge:(int)age;- (int)age;@end
.m檔案中的代碼如下:
#import "Person.h"@implementation Person// 成員變數_name的setter方法和getter方法的實現- (void)setName:(NSString *)name{ _name = name; }- (NSString *)name{ return _name;}// 成員變數_age的setter方法和getter方法的實現- (void)setAge:(int)age{ //在這可以限制輸入的年齡是否合法 if (age >= 18) { _age = age; } else { _age = 18; } }- (int)age{ return _age;}@end
OC中沒有方法的重載,所謂的參數多一個是因為方法的名稱變了,提示:do: : : :
OC中static關鍵字的使用:唯一要注意的是成員變數不能定義成static,其它時候的使用跟C語言中一樣,請看我之前的部落格 >---點我就能看到---<
OC中的self關鍵字,self用到類方法中代表本類,self用到對象方法中表示這個對象
self修飾變數:會訪問成員變數請看代碼:(依然根據Person類)在.m檔案中
// 成員變數_name的setter方法和getter方法的實現- (void)setName:(NSString *)name{ self->speed = speed;// self->speed等價於_name// _name = name; }- (NSString *)name{ return _name;}
這裡再次說一下關於面對對象的四大特性分別為
1.抽象 2.封裝 3.繼承 4.多態
抽象性:抽象就是忽略一個主題中與當前目標無關的那些方面,以便更充分地注意與當前目標有關的方面。抽象並不打算瞭解全部問題,而只是選擇其中的一部分,暫時不用部分細節。比如,我們要設計一個學產生績管理系統,考察學生這個對象時,我們只關心他的班級、學號、成績等,而不用去關心他的身高、體重這些資訊。抽象包括兩個方面,一是過程抽象,二是資料抽象。過程抽象是指任何一個明確定義功能的操作都可被使用者看作單個的實體看待,儘管這個操作實際上可能由一系列更低級的操作來完成。資料抽象定義了資料類型和施加於該類型對象上的操作,並限定了對象的值只能通過使用這些操作修改和觀察。
有關於封裝,繼承,多態請看我之前的部落格(還介紹了分類) >---請點擊這裡---<
成員變數修飾符的介紹
description方法:重寫父類的description方法可以改變NSLog的輸出
如果在-description方法中使用NSLog列印self 會造成死迴圈
代碼如下
//重寫父類的description-(NSString *)description{ // do something.... // 例如 return [NSString stringWithFormat:<#(NSString *), ...#>];}
類的本質是對象
類對象屬於Class類型
// 擷取類對象的2種方式Class c = [Person class]; // 類方法// 或者Person *p = [Person new];Class c2 = [p class]; // 對象方法
類方法中不能調用成員變數
SEL
1.方法的儲存位置
- 每個類的方法列表都儲存在類對象中
- 每個方法都有一個與之對應的SEL類型的對象
- 根據一個SEL對象就可以找到方法的地址,進而調用方法
- SEL類型的定義
typedef struct objc_selector *SEL;
2.SEL對象的建立
SEL s = @selector(test);SEL s2 = NSSelectorFromString(@"test");
3.SEL對象的其他用法
// 將SEL對象轉為NSString對象NSString *str = NSStringFromSelector(@selector(test));Person *p = [Person new];// 調用對象p的test方法[p performSelector:@selector(test)];
OC中的點文法 是Xcode的特性,Xcode幫我們做代碼替換
// Xcode會幫我們把下面的代碼替換成[person setAge:18];person.age = 18;// Xcode會幫我們把下面的代碼替換成[person age];int a = person.age;
@property 和 @synthesize
@property 編譯器指令,編譯器幫我們會進行_age _name get/set方法的聲明
@synthesize幫我們實現了 執行個體變數的get和set方法
Xcode4.4之後@property既可以幫我進行_age _name get/set方法的聲明,也可以實現執行個體變數的get和set方法
@property (nonatomic, assign) int age;@property (nonatomic, copy) NSString *name;
id是萬能指標,可以指向任何對象
OC中的構造方法
重寫構造方法,讓對象建立成功後,就有初始的值
OC中給對象進行初始化的方法是:init對象方法 該方法返回的是一個對象(調用init方法的對象)
// 當子類把父類的init覆蓋了,這是預設的先執行子類的- (instancetype)init{ //先讓父類把父類原來做的事情做完 self = [super init]; //判斷父類是否初始化成功 if (self) { //此處寫子類初始化的內容 _age = 18; //給年齡設定為預設值 18歲 } return self; //self指代的事方法的調用者}
自訂構造方法
.h檔案代碼如下
#import <Foundation/Foundation.h>@interface Person : NSObject@property (nonatomic, copy) NSString* name;@property (nonatomic, assign) int age;// 自訂構造方法- (instancetype)initWithName:(NSString *)name andAge:(int)age;@end
.m檔案代碼如下
#import "Person.h"@implementation Person- (instancetype)initWithName:(NSString *)name andAge:(int)age{ if (self = [super init]) { _name = name; _age = age; } return self;}@end
Objective-C知識總結(2)