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方法注意
- 在實際的應用中,不一定set和get方法都會提供,如果內部的成員變數,比如學生的學號或計算出來的資料。這樣的資料只允許外界讀取,但是不允許修改的情況,則通常只提供get方法而不提供set方法 。
- 成員變數名的命名以下劃線開頭,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開頭
================================================*/