標籤:
溫故而知新,繼續複習。
OC中可以通過聲明屬性來省略setter和getter,達到讓代碼簡潔的目的。使用屬性時,不需要在介面和m檔案中進行執行個體變數的聲明和setter getter的實現,系統會自動提供這些,但是如果在介面部分自訂了執行個體變數,那麼將以自訂的為準,系統不會產生執行個體變數。
文法:採用@property關鍵字,並且@property不是變數,是方法。
命名:屬性名稱不加底線,只有執行個體變數才有底線。
屬性是一對setter和getter方法,屬性類型是setter方法中的參數類型,是getter方法中的傳回值類型。
特性:
1.讀寫性(readonly,readwrite,setter =,getter =)
readonly:唯讀狀態,通知編譯器,屬性只產生getter方法,不產生setter方法。
readwrite:讀寫狀態,通知編譯器,屬性既產生setter方法,也產生getter方法。
setter =/getter =:方法重新命名。setter = set://getter = get:。
2.原子性(atomic,nonatomic)
atomic:原子性。預設修飾符,保證了執行個體變數在多線程情況下訪問是安全的, 通過不斷加鎖解鎖實現在同一時刻執行個體變數只能被一個線程訪問。但是不斷的加鎖解鎖會消耗大量的CPU效能。
nonatomic:非原子性。與atomic相反。
3.語義(assign,retain,copy)
語義不同,直接決定了屬性對應的setter,getter方法內部實現的不同。
assign:修飾的屬性是非物件類型,並且assign是預設的語義特性。
retain:所有物件類型的屬性,都可以用retain來修飾。
copy:也是用來修飾物件類型的屬性,但是一定要保證代表屬性類型的這個類必須接收了NSCopying,而且實現了copyWithZone:方法。字串通常用copy來修飾。
語義特性涉及到了OC裡記憶體管理的知識。先上代碼:
1 @synthesize height = _height; 2 - (void)setHeight:(CGFloat)height 3 { 4 _height = height; 5 } 6 - (CGFloat)height 7 { 8 return _height; 9 }10 @synthesize school = _school;11 - (void)setSchool:(NSString *)school12 {13 if (_school != school)14 {15 [_school release];16 _school = [school retain];17 }18 }19 - (NSString *)school20 {21 return [[_school retain] autorelease];22 }23 @synthesize major = _major;24 - (void)setMajor:(NSString *)major25 {26 if (_major != major)27 {28 [_major release];29 _major = [major copy];30 }31 }32 - (NSString *)major33 {34 return [[_major retain] autorelease];35 }
可以發現school屬性和major屬性與平時看到的setter和getter方法不一樣,這是因為school和major是NSString類型,即物件類型,所以用retain或者copy語義修飾,因此需要這樣去寫,具體的記憶體管理知識在後面詳細記錄。
另外需要注意的是,如果沒有@synthensize對屬性的實現,還重寫了setter和getter方法,那麼就不會產生相對應的執行個體變數。換句話,如果重寫了setter和getter,必須用@synthensize實現屬性,這樣才能產生執行個體變數。
點文法
如果接觸過其他的OOP語言,對這個點文法應該很熟悉,點文法就是屬性的另一種調用方式,前面一直用getter去訪問屬性,其實可以直接通過對象名.屬性名稱的方式來訪問。
【Objective-C學習記錄】第二十一天