1. 程式人生 > >OC - @property與setter,getter方法

OC - @property與setter,getter方法

先說說setter與getter方法的作用

先上一段.m

/*=================================================
 設計一個K線類, 有三個屬性, 最高價格, 最低價格, 平均價格. 
 要求可以設定和獲取這三個屬性
 =================================================*/
//  Created by 大L君 on 16/1/20.
//  Copyright © 2016年 bigL.com. All rights reserved.

#import <Foundation/Foundation.h>
@interface Kline : NSObject { @protected//保護性 int _valueTheHigh; int _valueTheLow; int _valueAver; } //setter方法宣告 -(void)setValueTheHigh : (int)valueTheHigh; -(void)setValueTheLow:(int)valueTheLow; -(void)setValueTheAver:(int)valueTheAver; //getter方法宣告 -(int)valueTheHigh; -(int)valueTheLow; -(int
)valueTheAver; @end @implementation Kline //setter方法實現 -(void)setValueTheHigh : (int)valueTheHigh { _valueTheHigh = valueTheHigh; } -(void)setValueTheLow:(int)valueTheLow { _valueTheLow = valueTheLow; } -(void)setValueTheAver:(int)valueTheAver { _valueAver = valueTheAver; } //getter方法實現 -(int
)valueTheHigh { return _valueTheHigh; } -(int)valueTheLow { return _valueTheLow; } -(int)valueTheAver { return _valueAver; } @end int main(int argc, const char * argv[]) { @autoreleasepool { Kline *kp = [Kline new]; //只能通過setter方法對成員物件賦值 [kp setValueTheHigh:20]; //點語法在=號左邊展開為setter方法 kp.ValueTheLow = 10; //只能通過getter方法對成員物件讀取 int num = [kp valueTheHigh]; //點語法在=號左邊展開為[kp 方法名]; int num2 = kp.valueTheLow; NSLog(@"valueTheHigh : %i",num); NSLog(@"valueTheLow : %i",num2); } return 0; }

/*=================================================

一 . setter方法

作用:用來設定成員變數,可以在方法裡面過濾掉一些不合理的值

命名規範:

必須是物件方法
返回值型別為void
方法名必須以set開頭,而且後面跟上成員變數名去掉”_” 首字母必須大寫
必須提供一個引數,引數型別必須與所對應的成員變數的型別一致
形參名稱和成員變數去掉下劃線相同
setter方法的好處

setter方法優點:
不讓資料暴露在外,保證了資料的安全性
對設定的資料進行過濾
===============================================/ /

二 .getter方法

作用:為呼叫者返回物件內部的成員變數的值

命名規範:

必須是物件方法
必須有返回值,返回值的型別和成員變數的型別一致
方法名必須是成員變數去掉下劃線
一定是沒有引數的

getter方法的優點:
可以讓我們在使用getter方法獲取資料之前,對資料進行加工;
比如雙十一活動,我們希望對全線商品的價格在原來的價格基礎上打五折,那麼我們只要去改成品類的價格的getter方法就可以了,讓他返回的值為價格 * 0.5
===============================================//

三 .getter/setter方法注意

  1. 在實際的應用中,不一定set和get方法都會提供,如果內部的成員變數,比如學生的學號或計算出來的資料。這樣的資料只允許外界讀取,但是不允許修改的情況,則通常只提供get方法而不提供set方法 。
  2. 成員變數名的命名以下劃線開頭,get方法名不需要帶下劃線
    成員變數名使用下劃線開頭有兩個好處 :
    a. 與get方法的方法名區分開來
    b. 可以和一些其他的區域性變數區分開來,下劃線開頭的變數,通常都是類的成員變數。當我看到以下劃線開頭變數,那麼他一定是成員變數
    =================================================*/

@property與setter/getter方法

將上面的.m改寫用@property

/*===================================================
 設計一個K線類, 有三個屬性, 最高價格, 最低價格, 平均價格. 要求可以設定和獲取這三個屬性
===================================================*/
//  Created by 大L君 on 16/1/20.
//  Copyright © 2016年 bigL.com. All rights reserved.

#import <Foundation/Foundation.h>

@interface Kline : NSObject
//@property 生成setter/getter方法宣告與方法實現
@property int valueTheHigh;
@property int valueTheLow;
@property int valueTheAver;
@end

@implementation Kline

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Kline *kp = [Kline new];
        //只能通過setter方法對成員物件賦值
        [kp setValueTheHigh:20];
        //點語法在=號左邊展開為setter方法
        kp.valueTheLow= 10;
        //只能通過getter方法對成員物件讀取
        int num = [kp valueTheHigh];
        //點語法在=號左邊展開為[kp 方法名];
        int num2 = kp.valueTheLow;
        NSLog(@"valueTheAver : %i",num);
        NSLog(@"valueTheHigh : %i",num2);
    }
    return 0;
}

/*=================================================

[email protected]的定義與使用

1.什麼是@property
@property是編譯器的指令

什麼是編譯器的指令 ?
編譯器指令就是用來告訴編譯器要做什麼!

@property會讓編譯器做什麼呢?
@property 用在宣告檔案中告訴編譯器宣告成員變數的的訪問器(getter/setter)方法
這樣的好處是:免去我們手工書寫getter和setter方法繁瑣的程式碼

[email protected]基本使用

在@inteface中,用來自動生成setter和getter的宣告
用@property int age;就可以代替下面的兩行
- (int)age; // getter方法
- (void)setAge:(int)age; // setter方法

[email protected] 使用格式

@interface 類名 : 父類名
{
(資料型別1)成員變數1;
}
@property (資料型別1)成員變數名1(去掉下), (資料型別2)成員變數2(去掉下);
//在Xcode 4.X版本之後@property自動生成setter與getter的宣告與方法(以下預設使用該形式)
//預設情況下,setter和getter方法中的實現,會去訪問下劃線_開頭的成員變數,
//如果沒有會自動生成一個_開頭的成員變數,自動生成的成員變數是私有變數, 宣告在.m中,在其它檔案中無法檢視,但當可以在本類中檢視
@end

四.注意點

[email protected]只會生成最簡單的getter/setter方法,而不會進行資料判斷
2.如果需要對資料進行判斷需要我們之間重寫getter/setter方法
3.若手動實現了setter方法,編譯器就只會自動生成getter方法
4.若手動實現了getter方法,編譯器就只會自動生成setter方法
5.若同時手動實現了setter和getter方法,編譯器就不會自動生成不存在的成員變數

[email protected]修飾符

修飾是否生成getter方法的
readonly 只生成setter方法,不生成getter方法
readwrite 既生成getter 又生成setter方法(預設)
示例:
@property (readonly) int age;

指定所生成的方法的方法名稱
getter=你定製的getter方法名稱
setter=你定義的setter方法名稱(注意setter方法必須要有 : )

@property (getter=isMarried) BOOL married;
說明,通常BOOL型別的屬性的getter方法要以is開頭
================================================*/