基礎回顧: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.”調用的就是方法本身,會形成死循環。
- 成員變量如果不需要外部訪問,則還是按以前的方式用大括號