IOS屬性的作用

2021-07-30 05:12:40 字數 3874 閱讀 5698

說明:在學習屬性前先理清屬性跟類和物件的關係。所以先說明一下類和物件。

類是抽象概念,用於抽象描述具有相同屬性和行為的某一類物件。比如:人、車等。

物件是類的例項化,具體描述這個類別中的乙個實體。

類是抽象的,不佔記憶體;物件是具體的,佔記憶體。

舉例:

「人」是乙個類,人的屬性有名字、身高、性別、膚色、國籍等等。人的行為有吃飯、睡覺、尿尿等等。但是,在類別裡這些都是抽象的,是用來描述「人」這一類物件。

小紅是乙個物件,她的名字是小紅、性別是女,國籍是中國。她的行為是正在睡覺。這些都是具體存在的,這些具體存在描述了小紅這個物件

編譯器遇到關鍵字@property會自動為這個屬性新增setter/getter方法,避免了每次手動新增的麻煩。

關係:屬性是乙個類中用來描述物件的抽象概念,乙個類可以有很多屬性,乙個屬性可以描述物件的乙個特徵。

以下面的屬性**舉例:

@property (copy, nonatomic) nsstring *mytitle;//宣告屬性
表面關係:

當我們宣告乙個屬性的時候,編譯器就會為我們自動生成對應的例項變數_mytitle,當然,我們也可以通過關鍵字synthesize手動生成對應的例項變數mytitle;

實質原因:

鏈結首先要知道屬性是oc的一種新的語言機制,宣告的屬性必須要有相對應的例項變數。

***.h***

@inte***ce

viewcontroller : uiviewcontroller

//編譯器遇到@property會自動宣告對應的setter/getter

@property (copy, nonatomic) nsstring *mytitle;

@end

***.m***

//編譯器遇到@synthesize會自動實現setter/getter方法

//編譯器遇到@synthesize回去訪問mytitle的同名變數,如果沒找到就報錯。

@synthesize mytitle;

屬性改變步驟:

1.第一版,最早版本

***.h***

@inte***ce

viewcontroller : uiviewcontroller

//編譯器遇到@property會自動宣告對應的setter/getter

@property (copy, nonatomic) nsstring *mytitle;

@end

***.m***

//編譯器遇到@synthesize會自動實現setter/getter方法

//編譯器遇到@synthesize回去訪問mytitle的同名變數,如果沒找到就報錯。

@synthesize mytitle;

2.第二版,不需要自己手動宣告乙個成員變數,關鍵字@synthesize會預設去訪問mytitle的同名變數,如果找不到則會自動生成乙個

***.h***

@inte***ce

viewcontroller : uiviewcontroller

@property (copy, nonatomic) nsstring *mytitle;

@end

***.m***

/* 1.編譯器遇到@synthesize會自動實現setter/getter方法;

2.編譯器遇到@synthesize回去訪問mytitle的同名變數;

3.如果找不到同名的變數,會自動生成乙個私有同名變數mytitle

4.因此現在開始就不用再手動宣告乙個例項變數了,

*/@synthesize mytitle;

3.第三版,考慮到變數名和getter的方法名、setter的引數名一樣,容易讓人誤會,引起警告,所以預設給屬性生成的同名變數名帶下劃線。

/*

1.指定_mytitle作為mytitle的例項變數

2.這樣我們就可以去使用_mytitle,避免和setter名同名產生誤會了

*/@synthesize mytitle = _mytitle;

4.第四版,在ios4.5後,也@synthesize可以省略了,最終就變成這樣了

@property (copy, nonatomic) nsstring *mytitle;
如果我們把上面的過程全部顯示出來的話,本質如下:

**.h**

#import

@inte***ce

viewcontroller : uiviewcontroller

@property (copy, nonatomic) nsstring *mytitle;

//***被隱藏的*****

//編譯器遇到@property會自動宣告setter/getter方法

- (void)setmytitle:(nsstring *)mytitle;

- (nsstring *)mytitle;

@end

**.m**

/****被隱藏的*****

1.@synthesize關鍵字會自動實現setter/getter的方法

2.@synthesize mytitle = _mytitle指明了屬性mytitle的例項變

量是_mytitle,setter/getter操作的物件就是_mytitle.

*/@synthesize mytitle = _mytitle;

- (void)viewdidload

//***被隱藏的*****

//由關鍵字@synthesize自動實現

- (nsstring *)mytitle

- (void)setmytitle:(nsstring *)mytitle

**說明:

1.編譯器遇到關鍵字@property,自動宣告setter/getter方法。

2.編譯器遇到@synthesize,自動實現setter/getter方法。

3.@synthesize mytitle = _mytitle;為屬性mytitle生成了乙個例項變數_mytitle,所以我們對屬性的操作self.mytitle實質上都是在操作_mytitle變數。

所以屬性、例項變數和成員變數的關係是:

宣告屬性的時候編譯器自動生成的例項變數,例項變數的本質就是成員變數,self.mytitle操作屬性的時候實質上是在操作成員變數_mytitle(也就是例項變數)。

同時重寫setter/getter的問題:

我們會發現,當我們同時重寫setter/getter時會報錯,為什麼呢?這是因為當我們同時重寫setter/getter時,編譯器自動新增的**@synthesize mytitle = _mytitle;失效,就不會自動為我們生成例項變數_mytitle了,setter/getter操作的物件就不存在了。所以我們要加上@synthesize mytitle = _mytitle;,手動指定setter/getter要操作的例項物件是_my

iOS 屬性的屬性

賦值 class.propertya instancea retain,assign,copy 只影響 instancea的計數,可能增加,可能不變。到這句執行完畢為止,只要instancea是合法的,propertya就是合法的。retain,assign,copy 誰建立了instancea還是...

HTML rel屬性的作用

rel與rev屬性相同,它們都是屬於linktypes屬性.rel 屬性 rel屬性,描述了當前頁面與href所指定文件的關係,rel是relationship的英文縮寫.rev 屬性 rev屬性,描述了href所指定文件與當前頁面的關係,rel是reverse link的英文縮寫.rel屬性通常出...

box sizing 的屬性及其作用

box sizing content box box sizing border box box sizing inheritbox sizing的預設屬性值 由 css2.1 規定的寬度高度行為。寬度和高度分別應用到元素的內容框。在寬度和高度之外繪製元素的內邊距和邊框。為元素設定的寬度和高度決定了...