說明:在學習屬性前先理清屬性跟類和物件的關係。所以先說明一下類和物件。
類是抽象概念,用於抽象描述具有相同屬性和行為的某一類物件。比如:人、車等。
物件是類的例項化,具體描述這個類別中的乙個實體。
類是抽象的,不佔記憶體;物件是具體的,佔記憶體。
舉例:編譯器遇到關鍵字「人」是乙個類,人的屬性有名字、身高、性別、膚色、國籍等等。人的行為有吃飯、睡覺、尿尿等等。但是,在類別裡這些都是抽象的,是用來描述「人」這一類物件。
小紅是乙個物件,她的名字是小紅、性別是女,國籍是中國。她的行為是正在睡覺。這些都是具體存在的,這些具體存在描述了小紅這個物件
@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 規定的寬度高度行為。寬度和高度分別應用到元素的內容框。在寬度和高度之外繪製元素的內邊距和邊框。為元素設定的寬度和高度決定了...