iOS學習筆記1(結合專案)---oc的@property屬性
“屬性”(property)有兩大概念:ivar(例項變數)、存取方法(access method=getter),即@property = ivar + getter + setter。
例如下面的這個類:
@interface WBTextView :UITextView
@property (nonatomic,copy)NSString *placehold;
@property (nonatomic,copy)UIColor *placeholdColor;
@end
類完成屬性的定以後,編譯器會自動編寫訪問這些屬性的方法(自動合成autosynthesis),上述程式碼寫出來的類等效與下面的程式碼:
@interface WBTextView :UITextView
- (NSString *)placehold;
-(void)setPlacehold:(NSString *)placehold;
-(UIColor *)placeholdColor;
-(void)setPlaceholdColor:(UIColor *)placeholdColor;
@end
大家可能會想,編譯器是如何實現該功能。原理如下:
1)OBJC_IVAR_$類名$屬性名稱 :該屬性的“偏移量” (offset),這個偏移量是“硬編碼” (hardcode),表示
該變數距離存放物件的記憶體區域的起始地址有多遠。
2)setter與getter方法對應的實現函式
3)ivar_list :成員變數列表
4)method_list :方法列表
5)prop_list :屬性列表
也就是說我們每次在增加一個屬性,系統都會在ivar_list中新增一個成員變數的描述,在method_list中
增加setter與getter方法的描述,在屬性列表中增加一個屬性的描述,然後計算該屬性在物件中的偏移量,
然後給出setter與getter方法對應的實現,在setter方法中從偏移量的位置開始賦值,在getter方法中從
偏移量開始取值,為了能夠讀取正確位元組數,系統物件偏移量的指標型別進行了型別強轉.
雖說系統自帶的自動合成(autosynthesis)給我們帶來很多方便,但有時一不小心就有可能導致錯誤。
@import Foundation;
@interface WBTextView :UITextView
@property (nonatomic,copy)NSString *placehold;
@end
-(instancetype)init
{
self = [superinitWithFrame:frame];
if (self) {
_placeholde = @"jasonjwl";
}
returnself;
}
-(NSString *)placehold
{
return _placehold;
}
-(void)setPlacehold:(NSString *)placehold
{
_placehold = [placehold copy];
}
上面的程式碼不能通過編譯,因為當你同時重寫setter和getter時,系統不會生成ivar變數。
那什麼情況下,不會autosynthesis?
1.同時重寫了setter和getter時重寫了只讀屬性的getter時
2.使用了@dynamic時
3.在 @protocol 中定義的所有屬性
4.在 category 中定義的所有屬性
5.過載的屬性
感謝程式猿的提供《招聘一個靠譜的 iOS》—參考答案(上)
相關文章
- iOS 屬性學習筆記iOS筆記
- iOS學習筆記2(結合專案)--Category和Extension的區別iOS筆記Go
- iOS類新增方法、屬性學習筆記iOS筆記
- iOS @property 屬性相關的總結iOS
- Property屬性
- JavaScript中的物件學習筆記(屬性操作)JavaScript物件筆記
- iOS學習筆記-動畫篇1iOS筆記動畫
- Vue學習筆記(六):監視屬性Vue筆記
- 專案管理指南學習筆記-專案執行環境(1)專案管理筆記
- vue學習筆記(一)---- vue指令( v-bind 屬性繫結 )Vue筆記
- iOS @property及其關鍵字學習記錄iOS
- Vue & Bootstrap 結合學習筆記(一)Vueboot筆記
- Vue & Bootstrap 結合學習筆記(二)Vueboot筆記
- HTML5 學習筆記 表單屬性HTML筆記
- PLC結構化文字(ST)——屬性(Property)
- 階段性總結_學習筆記筆記
- js便籤筆記(2)——DOM元素的特性(Attribute)和屬性(Property)JS筆記
- iOS-Socket開發學習筆記-1iOS筆記
- C#學習筆記-欄位、屬性、索引器C#筆記索引
- 資料結構學習筆記1資料結構筆記
- angular學習筆記(四)- input元素的ng-model屬性Angular筆記
- Python 中的 property 屬性Python
- Objective C之NSDictionary學習筆記(IOS 9 1)Object筆記iOS
- iOS學習筆記-TableView效能優化篇1iOS筆記View優化
- IOS 學習筆記(1) 檢視UIViewControlleriOS筆記UIViewController
- PHP 手冊 (類與物件) 學習筆記二:屬性PHP物件筆記
- Swift學習筆記第六篇(類,屬性,方法)Swift筆記
- 學習筆記1筆記
- 學習筆記-1筆記
- TensorFlow學習筆記(1):線性迴歸筆記
- O(n)-O(1) 線性 RMQ 學習筆記MQ筆記
- OC 常用知識筆記 (1)筆記
- iOS Block學習筆記iOSBloC筆記
- iOS Runloop學習筆記iOSOOP筆記
- OC語言瘋狂講義學習筆記C語言筆記
- swift專案呼叫OC庫 和OC專案 在swift檔案裡面全域性呼叫OC庫Swift
- 機器學習的學習筆記1機器學習筆記
- CSS學習——關於連結的屬性CSS