屬性和成員變量的區(qū)別

屬性和成員變量的區(qū)別

成員變量是定義在類的@interface和@implementation的{}中的變量,一般用@public,@private,@protected,@package來(lái)標(biāo)明他的作用域 -@public:在任何地方都能直接訪問(wèn)對(duì)象的成員變量 -@private:只能在當(dāng)前類的對(duì)象中直接訪問(wèn),如果子類中訪問(wèn),需要調(diào)用父類的get/set方法 -@protected:可以在當(dāng)前類及其子類對(duì)象中直接訪問(wèn)(系統(tǒng)默認(rèn)修飾詞) -@package:在同一個(gè)包下就可以直接訪問(wèn)百科,比如說(shuō)在同在一個(gè)框架 -在.m文件中成員變量的修飾符為@private -在.h文件中成員變量的修飾符為@protected 通常通過(guò)一對(duì)訪問(wèn)器方法(getter/setter)來(lái)訪問(wèn)對(duì)象的屬性 屬性聲明是以關(guān)鍵詞@property開(kāi)頭,@property可以出現(xiàn)在類的@interface塊中聲明的任何地方。@property還可以出現(xiàn)在protocol或者category中。

@synthesize的作用是實(shí)現(xiàn)屬性的,如getter,setter方法 在OC屬性設(shè)置里面,默認(rèn)的就是atomic,意思就是setter/getter函數(shù)是一個(gè)原子操作,如果多線程同時(shí)調(diào)用setter時(shí),不會(huì)出現(xiàn)某一個(gè)線程執(zhí)行完setter所有語(yǔ)句之前,另一個(gè)線程就開(kāi)始執(zhí)行setter,相當(dāng)于函數(shù)頭尾加了鎖,這樣的話,并發(fā)訪問(wèn)性能會(huì)比較低。

非原子操作一般不需要多線程支持的時(shí)候就用它,這樣在并發(fā)訪問(wèn)的時(shí)候效率會(huì)比較高。在OC里面通常對(duì)象類型都應(yīng)該聲明為非原子性的。iOS中程序啟動(dòng)的時(shí)候系統(tǒng)只會(huì)自動(dòng)生成一個(gè)單一的主線程。程序在執(zhí)行的時(shí)候一般情況下是在同一個(gè)線程里面對(duì)一個(gè)屬性進(jìn)行操作。

指定get方法,并需要實(shí)現(xiàn)這個(gè)方法。必須返回與聲明類型相同的變量,沒(méi)有參數(shù)。相當(dāng)于重新命名getter方法。

指定set方法,并需要實(shí)現(xiàn)這個(gè)方法。帶一個(gè)與聲明類型相同的參數(shù),沒(méi)有返回值(返回空值) 注:當(dāng)聲明為readonly的時(shí)候,不能指定set方法 有set/get方法,默認(rèn)是readwrite。 不可以被賦值,只有g(shù)et方法 通常用于標(biāo)量(簡(jiǎn)單變量int,float,CGRect等) 一種典型情況是用在對(duì)對(duì)象沒(méi)有所有權(quán)的時(shí)候,通常是delegate,避免造成*循環(huán)(如果用retain的話會(huì)*循環(huán)) 釋放舊對(duì)象,將舊對(duì)象的值賦予輸入對(duì)象,在提高輸入對(duì)象的索引計(jì)數(shù)為1,常使用在繼承自NSObject的類。

(MRC為retain) 不增加對(duì)對(duì)象的引用計(jì)數(shù),也不持有對(duì)象,因此不能決定對(duì)象的釋放。

屬性與成員變量有什么區(qū)別

局部變量,存在于定義其的作用域內(nèi),如此例,則它的存活區(qū)域就是main函數(shù)內(nèi)部,函數(shù)跳出后它就被銷毀成員變量,存在于定義其的對(duì)象存活區(qū)域內(nèi),如此例,則它的存活期由一個(gè)類A的對(duì)象實(shí)例化開(kāi)始到銷毀這個(gè)對(duì)象結(jié)束補(bǔ)充: 看錯(cuò),我說(shuō)的此例,就是1樓那個(gè)例子,我以為問(wèn)題里發(fā)的

成員變量、實(shí)例變量和屬性變量的區(qū)別

?1、成員變量是聲明在類{}中的?2、實(shí)例變量其實(shí)是包含在成員變量中的一種,是有指針引用類型的可叫實(shí)例變量,其他的叫基礎(chǔ)數(shù)據(jù)類型變量。 3、屬性變量 @property會(huì)自動(dòng)生成getter/setter方法,并將生成一個(gè)帶_的實(shí)例變量,比如:@property(nonatomic,copy)NSString * name; 會(huì)生成_name成員變量供自己調(diào)用,外部類還是繼續(xù)可以使用name進(jìn)行調(diào)用,也可調(diào)用生成的方法。

4、屬性變量可以在.m文件中使用 @synthesize name = otherName; 可以將成員變量用新的名字替代,這時(shí)你便可以使用otherName,name也不會(huì)生成。

或者你不想調(diào)用_name,可以直接 @synthesize name = name?和更為簡(jiǎn)潔的用?@synthesize name。 5、以下情況是不會(huì)自動(dòng)合成的(使用?@synthesize ) 1.同時(shí)重寫了setter/getter方法。 2.重寫了只讀的getter方法。 3.使用了@dynamic 4.在@protocol定義的屬性。

5.在category定義的屬性。 6.重載的屬性。

在objective-c中,屬性和成員變量有什么區(qū)別,感覺(jué)好像用起來(lái)是一樣的。

屬性可以用dot(.)語(yǔ)法,比如self.xxx,在外部調(diào)用也同樣可以someClass.xxx。屬性實(shí)際上是對(duì)一組set和get方法的簡(jiǎn)單封裝(oc的get方法沒(méi)有g(shù)et前綴),同樣會(huì)自動(dòng)生成一個(gè)私有的成員變量(名稱為:下劃線+屬性名)。

成員變量無(wú)論是全局還是局部的,都只能在本類或當(dāng)前函數(shù)中使用,在其之外的地方無(wú)法直接調(diào)用(可以通過(guò)間接的方式調(diào)用)。

在本類使用時(shí),屬性self.xxx會(huì)給私有的_xxx變量增加一次引用計(jì)數(shù),相當(dāng)于多retain了一次。如果不使用ARC,分別給普通變量和屬性賦值,打印一下引用計(jì)數(shù)你就明白了。如果你使用ARC,完全不需要考慮引用計(jì)數(shù)相關(guān)的東西??偠灾?,如果你當(dāng)前類需要被外部調(diào)用,而且需要方便訪問(wèn)某個(gè)變量,那就應(yīng)該把這個(gè)變量設(shè)為屬性。

如果只是在類內(nèi)部使用,使用普通變量和使用屬性沒(méi)有任何區(qū)別,就看個(gè)人習(xí)慣了。