1. 程式人生 > 其它 >iOS開發-學習筆記-屬性

iOS開發-學習筆記-屬性

技術標籤:iOS學習筆記iosobjective-c

屬性是怎麼達到減少程式碼數量的作用的


使用屬性關鍵字,不需要太多的方法定義語句,因為多個方法裡面可能都有相同屬性的欄位定義,只要使用屬性關鍵字,不同的方法都可以對這個屬性進行設定和訪問.
標頭檔案中這樣使用:

#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. 對於那些函式,它們只使用傳遞過來的值,而不對值進行修改,則使用值傳遞:
    (1)如果資料物件很小,如內建資料型別或小型結構,使用按值傳遞。
    (2)如果資料物件是陣列,則使用指向const的指標。
    (3)如果資料物件是較大的結構,則使用const指標或者const引用,以提高程式的效率。
    (4)如果資料物件是類物件,則使用const引用。因此,傳遞類物件引數的標準方式是按引用傳遞。

  2. 對於那些函式,它們需要修改傳遞過來的值, 則使用指標:
    (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方法, 不儲存值,而是建立一個能在執行時計算出此值的方法.