屬性和成員變量的區(qū)別
屬性和成員變量的區(qū)別
成員變量是定義在類的@interface和@implementation的{}中的變量,一般用@public,@private,@protected,@package來標(biāo)明他的作用域 -@public:在任何地方都能直接訪問對象的成員變量 -@private:只能在當(dāng)前類的對象中直接訪問,如果子類中訪問,需要調(diào)用父類的get/set方法 -@protected:可以在當(dāng)前類及其子類對象中直接訪問(系統(tǒng)默認修飾詞) -@package:在同一個包下就可以直接訪問百科,比如說在同在一個框架 -在.m文件中成員變量的修飾符為@private -在.h文件中成員變量的修飾符為@protected 通常通過一對訪問器方法(getter/setter)來訪問對象的屬性 屬性聲明是以關(guān)鍵詞@property開頭,@property可以出現(xiàn)在類的@interface塊中聲明的任何地方。@property還可以出現(xiàn)在protocol或者category中。
@synthesize的作用是實現(xiàn)屬性的,如getter,setter方法 在OC屬性設(shè)置里面,默認的就是atomic,意思就是setter/getter函數(shù)是一個原子操作,如果多線程同時調(diào)用setter時,不會出現(xiàn)某一個線程執(zhí)行完setter所有語句之前,另一個線程就開始執(zhí)行setter,相當(dāng)于函數(shù)頭尾加了鎖,這樣的話,并發(fā)訪問性能會比較低。
非原子操作一般不需要多線程支持的時候就用它,這樣在并發(fā)訪問的時候效率會比較高。在OC里面通常對象類型都應(yīng)該聲明為非原子性的。iOS中程序啟動的時候系統(tǒng)只會自動生成一個單一的主線程。程序在執(zhí)行的時候一般情況下是在同一個線程里面對一個屬性進行操作。
指定get方法,并需要實現(xiàn)這個方法。必須返回與聲明類型相同的變量,沒有參數(shù)。相當(dāng)于重新命名getter方法。
指定set方法,并需要實現(xiàn)這個方法。帶一個與聲明類型相同的參數(shù),沒有返回值(返回空值) 注:當(dāng)聲明為readonly的時候,不能指定set方法 有set/get方法,默認是readwrite。 不可以被賦值,只有g(shù)et方法 通常用于標(biāo)量(簡單變量int,float,CGRect等) 一種典型情況是用在對對象沒有所有權(quán)的時候,通常是delegate,避免造成*循環(huán)(如果用retain的話會*循環(huán)) 釋放舊對象,將舊對象的值賦予輸入對象,在提高輸入對象的索引計數(shù)為1,常使用在繼承自NSObject的類。
(MRC為retain) 不增加對對象的引用計數(shù),也不持有對象,因此不能決定對象的釋放。
屬性與成員變量有什么區(qū)別
局部變量,存在于定義其的作用域內(nèi),如此例,則它的存活區(qū)域就是main函數(shù)內(nèi)部,函數(shù)跳出后它就被銷毀成員變量,存在于定義其的對象存活區(qū)域內(nèi),如此例,則它的存活期由一個類A的對象實例化開始到銷毀這個對象結(jié)束補充: 看錯,我說的此例,就是1樓那個例子,我以為問題里發(fā)的
成員變量、實例變量和屬性變量的區(qū)別
?1、成員變量是聲明在類{}中的?2、實例變量其實是包含在成員變量中的一種,是有指針引用類型的可叫實例變量,其他的叫基礎(chǔ)數(shù)據(jù)類型變量。 3、屬性變量 @property會自動生成getter/setter方法,并將生成一個帶_的實例變量,比如:@property(nonatomic,copy)NSString * name; 會生成_name成員變量供自己調(diào)用,外部類還是繼續(xù)可以使用name進行調(diào)用,也可調(diào)用生成的方法。
4、屬性變量可以在.m文件中使用 @synthesize name = otherName; 可以將成員變量用新的名字替代,這時你便可以使用otherName,name也不會生成。
或者你不想調(diào)用_name,可以直接 @synthesize name = name?和更為簡潔的用?@synthesize name。 5、以下情況是不會自動合成的(使用?@synthesize ) 1.同時重寫了setter/getter方法。 2.重寫了只讀的getter方法。 3.使用了@dynamic 4.在@protocol定義的屬性。
5.在category定義的屬性。 6.重載的屬性。
在objective-c中,屬性和成員變量有什么區(qū)別,感覺好像用起來是一樣的。
屬性可以用dot(.)語法,比如self.xxx,在外部調(diào)用也同樣可以someClass.xxx。屬性實際上是對一組set和get方法的簡單封裝(oc的get方法沒有g(shù)et前綴),同樣會自動生成一個私有的成員變量(名稱為:下劃線+屬性名)。
成員變量無論是全局還是局部的,都只能在本類或當(dāng)前函數(shù)中使用,在其之外的地方無法直接調(diào)用(可以通過間接的方式調(diào)用)。
在本類使用時,屬性self.xxx會給私有的_xxx變量增加一次引用計數(shù),相當(dāng)于多retain了一次。如果不使用ARC,分別給普通變量和屬性賦值,打印一下引用計數(shù)你就明白了。如果你使用ARC,完全不需要考慮引用計數(shù)相關(guān)的東西??偠灾绻惝?dāng)前類需要被外部調(diào)用,而且需要方便訪問某個變量,那就應(yīng)該把這個變量設(shè)為屬性。
如果只是在類內(nèi)部使用,使用普通變量和使用屬性沒有任何區(qū)別,就看個人習(xí)慣了。