OC基礎--self關鍵字,oc--self關鍵字
Self的使用:
1 self不能離開類 離開類之後沒有任何意義
2 self會自動區分類方法和對象方法
3 使用self的時候只需要關注self在哪一個方法中
如果在類方法中使用self 那麼self就代表當前類
如果在對象方法中使用self 那麼self就代表"當前調用該方法的對象"
聲明檔案.h:
#import <Foundation/Foundation.h> @interface Phone : NSObject { // 手機牌子 NSString* _type; } /*--------------------------getter-setter方法------------------------*/ // 屬性讀寫器 - (void) setType: (NSString *) type; - (NSString *) type; /*--------------------------對象方法----------------------------------*/ // 打電話 - (void) callWithNumber: (NSString *) number; // 發簡訊給 - (void) sendMessageWithNumber: (NSString *) number andContent: (NSString *) content; /*---------------------------類方法----------------------------------*/ // 警告 + (void) alert; // 關機 + (void) turnOFF; @end
實現檔案.m:
#import "Phone.h" @implementation Phone /*----------------實現屬性讀寫器-------------------*/ - (void)setType:(NSString *)type{ _type = type; } - (NSString *)type{ return _type; } /*----------------實現對象方法--------------------*/ // self == 當前調用該方法的對象 == phone // 打電話 - (void)callWithNumber:(NSString *)number{ // 使用self在對象方法中訪問成員變數 NSLog(@"用 %@ 手機給 %@ 打電話", self.type, number); } //發簡訊 - (void)sendMessageWithNumber:(NSString *)number andContent:(NSString *)content{ NSLog(@"用 %@ 手機給 %@ 發簡訊 簡訊內容: %@", self.type, number, content); // 使用self在對象方法中調用其他對象方法 [self callWithNumber:number]; } /*----------------實作類別方法----------------------*/ // self == 當前類 == Phone // 警告 + (void)alert{ NSLog(@"警告 手機電量不足 請及時充電"); // 使用self在類方法中調用其他類方法 [self turnOFF]; } // 關機 + (void)turnOFF{ NSLog(@"手機即將關機"); } @end
Main.m:
#import <Foundation/Foundation.h> #import "Phone.h"
int main(int argc, const char * argv[]) { Phone * phone = [Phone new]; phone.type = @"iPhone"; [phone sendMessageWithNumber:@"13222334455" andContent:@"對象方法發簡訊"]; [Phone alert]; return 0; } /* 2015-08-30 14:01:23.277 self[509:24866] 用 iPhone 手機給 13222334455 發簡訊 簡訊內容: 對象方法發簡訊 2015-08-30 14:01:23.278 self[509:24866] 用 iPhone 手機給 13222334455 打電話 2015-08-30 14:01:23.278 self[509:24866] 警告 手機電量不足 請及時充電 2015-08-30 14:01:23.278 self[509:24866] 手機即將關機 */
Self使用注意:
1 在setter-getter方法中 不能使用self和點文法來對成員屬性進行賦值和取值操作 會造成死迴圈
/*----------------實現屬性讀寫器-------------------*/ - (void)setType:(NSString *)type{ // _type = type; //self->_type = type; self.type = type; // 等效於 [self setType: type] 迴圈調用 setType: 方法 } - (NSString *)type{ // return _type; // return self->_type; return self.type; // 等效於 [self type]; 迴圈調用 type 方法 }
2 在對象方法中調用類方法 會報錯 因為self在對象方法中代表的是對象 而類方法需要通過類來調用
//發簡訊 - (void)sendMessageWithNumber:(NSString *)number andContent:(NSString *)content{ NSLog(@"用 %@ 手機給 %@ 發簡訊 簡訊內容: %@", self.type, number, content); // 使用self在對象方法中調用其他對象方法 [self callWithNumber:number]; // 錯誤資訊: No visible @interface for 'Phone' declares the selector 'alert'
[self alert]; } /*----------------實作類別方法----------------------*/ // self == 當前類 == Phone // 警告 + (void)alert{ NSLog(@"警告 手機電量不足 請及時充電"); // 使用self在類方法中調用其他類方法 [self turnOFF]; }
3 在類方法中不能調用對象方法或訪問成員變數 因為對象方法和成員屬性屬於對象
/*----------------實現對象方法--------------------*/ // self == 當前調用該方法的對象 == phone // 打電話 - (void)callWithNumber:(NSString *)number{ // 使用self在對象方法中訪問成員變數 NSLog(@"用 %@ 手機給 %@ 打電話", self.type, number); } /*----------------實作類別方法----------------------*/ // self == 當前類 == Phone // 警告 + (void)alert{ NSLog(@"警告 手機電量不足 請及時充電"); // 使用self在類方法中調用其他類方法 [self turnOFF]; // 錯誤資訊: No known class method for selector 'callWithNumber:' [self callWithNumber:@"13344552211"]; }
4 不能在對象方法或者類方法中利用self調用當前self所在的方法 會造成死迴圈
// 打電話 - (void)callWithNumber:(NSString *)number{ // 使用self在對象方法中訪問成員變數 NSLog(@"用 %@ 手機給 %@ 打電話", self.type, number); [self callWithNumber:number]; // 死迴圈 } // 關機 + (void)turnOFF{ NSLog(@"手機即將關機"); [self turnOFF]; // 死迴圈 }
self使用情境:
> 可以用於在對象方法之間進行相互調用
> 可以用於在類方法之間進行相互調用
> 可以用於區分成員變數和局部變數同名的情況
#import "Phone.h" @implementation Phone/*----------------實現屬性讀寫器-------------------*/- (void)setType:(NSString *)type{ // _type = type; //self->_type = type; self.type = type; // 等效於 [self setType: type] 死迴圈
}- (NSString *)type{ // return _type; //return self->_type; return self.type; // 等效於 [self type]; 死迴圈}/*----------------實現對象方法--------------------*/// self == 當前調用該方法的對象 == phone// 打電話- (void)callWithNumber:(NSString *)number{ // 使用self在對象方法中訪問成員變數 NSLog(@"用 %@ 手機給 %@ 打電話", self.type, number); [self callWithNumber:number]; // 調用當前所在方法 死迴圈}//發簡訊- (void)sendMessageWithNumber:(NSString *)number andContent:(NSString *)content{ NSLog(@"用 %@ 手機給 %@ 發簡訊 簡訊內容: %@", self.type, number, content); // 使用self在對象方法中調用其他對象方法 [self callWithNumber:number]; // 對象方法中調用類方法 錯誤資訊: No visible @interface for 'Phone' declares the selector 'alert' [self alert]; }/*----------------實作類別方法----------------------*/// self == 當前類 == Phone// 警告+ (void)alert{ NSLog(@"警告 手機電量不足 請及時充電"); // 使用self在類方法中調用其他類方法 [self turnOFF]; // 類方法中調用對象方法 錯誤資訊: No known class method for selector 'callWithNumber:' [self callWithNumber:@"13344552211"]; // 類方法中訪問成員變數 錯誤資訊: No member named 'type' in 'struct objc_class' NSLog(@"type = %@", self.type);}// 關機+ (void)turnOFF{ NSLog(@"手機即將關機"); [self turnOFF]; // 調用當前所在方法 死迴圈
}@end