基礎回顧:get方法和set方法(類的繼承多態)


基礎回顧:get方法和set方法

定義類成員變量時,可以在@interface中定義,也可以在@implementation中定義:

在@interface中聲明,成員變量的狀態是受保護的,即“@protected”;

在@implementation中聲明,成員變量的狀態是私有的,即“@private”

在類的外面,是無法直接訪問成員變量的,只有將成員變量修改為@public時,才可以外部訪問。

使用@public時,訪問成員變量使用“->”,如:

time->hour=25;

但使用@public是有風險的(如上面代碼中將hour設置為25,實際只有24小時),所以一般訪問成員變量都使用get和set方法;

get方法的聲明:

-(int)hour;    //get方法,命名規則:返回類型即成員變量的類型,方法名是成員變量名

set方法的聲明:

-(void)setHour:(int)newHour    //set方法,命名規則:返回類型是void,方法名是set+成員變量名字的首字母大寫,帶一個參數,參數類型位成員變量的類型

get方法的實現:

-(int)hour
{
    return hour;          
}

set方法的實現:

復制代碼
-(void)setHour:(int)newHour
{
    if(newHour>24||newHour<0)    //對不合理的值進行過濾
    {
         hour=0;
    }
    hour=newHour;
}
復制代碼

使用get方法和set方法之后,就可以使用“.”語法訪問成員變量:

time.h=22;

“.”語法可以自動調用get方法和set方法,當給成員變量賦值時,自動調用set方法;當獲得成員變量時,自動調用get方法;

time.h=22;    //自動調用set方法賦值
xiaoShi=time.h    //自動調用get方法獲得time.h的值

在Objective-C中,提供了兩個語句,可以自動生成get和set方法:

@property:只能用在@interface中,為成員變量自動生成相應的get和set方法聲明

@synthesize:只能用在@implementation中,為成員變量自動生成相應的get和set方法實現

例如:

@property int hour;

@synthesize hour;

進階:@property和@synthesize的特性

1.使用@property和@synthesize后,仍然可以使用setHour:來訪問成員變量:

Time *tm=[Time new];
[tm setHour:22];

2.使用@property和@synthsize后,雖然自動生成了get和set方法,仍然可以自己重新定義set和get方法,重新定義的方法會覆蓋掉自動生成的方法,OC的這個特性為過濾數據和設置某些規則提供了方便。

3.當只使用@property自動生成get和set方法時,@property會自動生成一個名為“_名稱”的成員變量:

@property int hour;  //自動生成成員變量"_hour"

這時@property自動進行了3個操作:

  1)生成一個名為“_hour”的成員變量(4.6版本以后的Xcode)

  2)為“_hour”生成相應的get和set方法的聲明

  3)位“_hour”生成相應的get和set方法的實現

所以,使用@propery后,就可以省略掉“{}”中的成員變量聲明,因為它已經自動生成了。

4.@synthesize hour,會尋找實例變量”hour”,如果沒有找到,則自動生成一個”hour”成員變量

使用:@synthesize hour=_hour,就可以使“hour”和”_hour”聯系起來了,並不再生成“hour”成員變量

5.在set和get方法中,不允許使用“self.”,因為“self.”調用的就是方法本身,會形成死循環。

  • 成員變量如果不需要外部訪問,則還是按以前的方式用大括號


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM