iOS開發-學習筆記-屬性
屬性是怎麼達到減少程式碼數量的作用的
使用屬性關鍵字,不需要太多的方法定義語句,因為多個方法裡面可能都有相同屬性的欄位定義,只要使用屬性關鍵字,不同的方法都可以對這個屬性進行設定和訪問.
標頭檔案中這樣使用:
#import <Foundation/Foundation.h>
#import "Tire.h"
@interface AllWeatherRadial : Tire
{
float rainHanding;
float snowHanding;
}
@property float rainHanding;
@property float snowHanding;
@end //AllWeatherradial
變數的宣告
變數的宣告既可以放在標頭檔案中,也可以一部分放在標頭檔案中,一部分在實現檔案中宣告.區別是如果想從子類中通過屬性來訪問變數,變數就必須放在標頭檔案中,如果變數只屬於當前類,則可以把它們放在.m檔案裡並且好刪除原interface中的宣告語句.
實現檔案中這樣使用:
@implementationAllWeatherRddial
{
float rainhanding;
float snowHanding;
}
@synthesize rainHanding;
@synthesize snowHanding;
- (id) initWithPressure: (float)p treadDepth: (float)td
{
if(self = [super initWithPressure: p treadDepth : td])
{
rainHanding = 23.7;
snowHanding = 42.5;
}
return (self);
}//initWithPressure : treadDepth
- (NSString *) description
{
NSString *desc;
desc = [[NSString alloc] initWithFormat: @"AllWeatherRadial: %.1f / %.1f / %.1f / %.1f", [self pressure], [self treadDepth], [self rainHanding], [self snowHanding]];
return (desc);
} //description
@end //AllWeathRadial
@property 預編譯指令的作用是自動宣告屬性的setter和getter方法.(簡化的是宣告),預編譯指令告訴編譯器物件具有這些型別的特性,還可以傳遞其他資訊,如只讀或只寫.在後臺會自動生成setter,getter的宣告語句.
@synthesize 關鍵字表示建立了該屬性的訪問程式碼, 作用是自動新增setter和getter方法的實現部分的預編譯程式碼(簡化的是實現), 可以使用dynamic編寫自己的訪問方法.
OC中的ID型別
OC中的ID型別,相當於C語言中的void *, 又可以稱為萬能指標, 代表一個可以指向任何OC物件的指標, 是一個通用的物件型別,因為id是動態型別,所以可以通過id型別直接呼叫指向物件中的方法,編譯器不會報錯.
但是方法必須是存在的,如果使用id型別的呼叫本專案中所有類中都沒有的方法,編譯器會報錯.
什麼時候用指標/值傳遞
在物件初始化的時候發現有時候使用的是值,有時候使用的是指標,使用的原則如下:
判斷標準是: 函式是否會對值進行修改。
對於那些函式,它們只使用傳遞過來的值,而不對值進行修改,則使用值傳遞:
(1)如果資料物件很小,如內建資料型別或小型結構,使用按值傳遞。
(2)如果資料物件是陣列,則使用指向const的指標。
(3)如果資料物件是較大的結構,則使用const指標或者const引用,以提高程式的效率。
(4)如果資料物件是類物件,則使用const引用。因此,傳遞類物件引數的標準方式是按引用傳遞。對於那些函式,它們需要修改傳遞過來的值, 則使用指標:
(1)如果資料物件是內建資料型別,則使用指標。
(2)如果資料物件師叔祖,則只能使用指標。
(3)如果資料物件是結構。則使用指標或者引用。
(4)如果資料物件是類物件,則使用引用。
點表示式
使用點.訪問物件的變數
tire.rainHanding = 20 + i;
如果點出現在=左邊,相當於呼叫了該變數的setter方法,如果點出現在變數右邊,則將呼叫變數的getter方法.
tire setRainHanding = 20 + i;
屬性的擴充套件
copy特性和retain保留和釋放特性
@property (copy) NSString *name;
@property (retain) Engine *engine;
編譯器和類的使用者將會知道name的屬性將會被複制;
engine的屬性可以使用的只有保留和釋放特性.
OC中assign、copy 、retain等關鍵字
屬性nonatomic和atomic相關
如果沒有為屬性指定任何特性,它們會預設使用nonatomic,assign,
nonatomic: 非原子屬性,不會為setter加鎖,非執行緒安全,適合記憶體小的移動裝置
atomic: 原子屬性,為setter方法加鎖(預設就是atomic),執行緒安全,需要消耗大量資源
iOS開發建議:
(1)所有屬性都宣告為nonatomic
(2)儘量避免多執行緒搶奪同一塊資源
(3)儘量將加鎖,資源搶奪的業務邏輯交給伺服器端處理,減小移動客戶端的壓力
只讀屬性
預設情況下,屬性是可變的,可讀可寫,使用時如下:
@interface Me : NSObject
{
float shoesize;
NSString *licenseNumber;
}
@property (readonly) float shoesize;
@property (readonly) NSString *licenseNumber;
@end
只讀屬性編譯時只會生成一個getter方法而不會生成setter方法.
dynamic自定義屬性
@dynamic可以告訴編譯器不要去建立變數或getter,setter方法, 不儲存值,而是建立一個能在執行時計算出此值的方法.