Objective-c語言_設定器和訪問器
阿新 • • 發佈:2019-01-23
設定器和訪問器
我們知道。一個鏈尾idea例項變數如果是被@protected 或者 @private所修飾,那麼我們將不能對該成員變數
進行復制,滿足了我們希望的封裝和安全。但是為了交換資訊,我們希望使用@public型別。似乎者兩者的矛盾
不可調節,這個時候我們就可以使用設定器與訪問器來解決這個問題。
例子:
main.m
Student.h#import <Foundation/Foundation.h> #import "Student.h" int main(int argc, const char * argv[]) { @autoreleasepool { Student *stu = [[Student alloc]init]; [stu setName:@"Rick"]; NSLog(@"%@",[stu name]); [stu setAge:10]; NSLog(@"%ld", [stu age]); } return 0; }
Student.m#import <Foundation/Foundation.h> @interface Student : NSObject { NSString *_name; NSInteger _age; NSString *_hobby; } //設定器(setter) 和 訪問器(getter) //name的設定器 -(void)setName:(NSString *)name ; //name的訪問器 -(NSString *)name ; -(void)setAge:(NSInteger)age; -(NSInteger)age; /* 設定器與訪問器的作用: 1.隱藏了例項變數 2.控制例項變數的讀寫 3.做正確性的校驗 對於設定器與訪問器來說,其命名規則: 1.設定器:-(void) set首字母大寫的例項變數:(例項變數的返回值型別)去掉下劃線的例項變數名 2.訪問器:-(例項變數的返回值型別)去掉下劃線的例項變數名 note: 對於類的名稱,其首字母要大寫 對於變數,其首字母小寫 遵循駱駝峰命名規則 有了setter 和 getter ,我們就可以把變數都定義@protected 或者 @private型別,儘量不要使用@public型別,它的好處如下: 1.在setter中加入合法性檢查。例如判斷年齡要大於0 2.更新被設定變數相關的其他變數的值,比如年齡與年份的關係 3.可以在debug中,在setter中追蹤log 4.在多執行緒中,如果要保護物件的併發訪問,則必須在getter/setter中加入同步鎖 缺點:手動編寫麻煩 */ @end
#import "Student.h" @implementation Student //name的設定器 -(void)setName:(NSString *)name { _name = name; } //name的訪問器 -(NSString *)name { return _name; } //對於age屬性來說,做正確性檢驗 -(void)setAge:(NSInteger)age { // _age = age; if (age < 18) { _age = 18 ; } else { _age = age; } } -(NSInteger)age { return _age; } @end