1. 程式人生 > >Objective-c語言_設定器和訪問器

Objective-c語言_設定器和訪問器

設定器和訪問器

我們知道。一個鏈尾idea例項變數如果是被@protected 或者 @private所修飾,那麼我們將不能對該成員變數

進行復制,滿足了我們希望的封裝和安全。但是為了交換資訊,我們希望使用@public型別。似乎者兩者的矛盾

不可調節,這個時候我們就可以使用設定器與訪問器來解決這個問題。

例子:

main.m

#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.h
#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
Student.m
#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