1.什么情況使用 weak 關(guān)鍵字,相比 assign 有什么不同?
a.在 ARC 中,在有可能出現(xiàn)循環(huán)引用的時(shí)候,往往要通過讓其中一端使用 weak 來解決,比如:delegate 代理屬性
b.自身已經(jīng)對(duì)它進(jìn)行一次強(qiáng)引用,沒有必要再?gòu)?qiáng)引用一次,此時(shí)也會(huì)使用 weak,自定義 IBOutlet控件屬性一般也使用 weak;當(dāng)然,也可以使用strong。在下文也有論述:
不同點(diǎn):
weak?此特質(zhì)表明該屬性定義了一種“非擁有關(guān)系” (nonowningrelationship)。為這種屬性設(shè)置新值時(shí),設(shè)置方法既不保留新值,也不釋放舊值。此特質(zhì)同assign類似,然而在屬性所指的對(duì)象遭到摧毀時(shí),屬性值也會(huì)清空(nilout)。而?assign的“設(shè)置方法”只會(huì)執(zhí)行針對(duì)“純量類型” (scalar type,例如 CGFloat 或 NSlnteger等)的簡(jiǎn)單賦值操作。assigin 可以用非 OC 對(duì)象,而 weak 必須用于 OC 對(duì)象
3.怎么用 copy 關(guān)鍵字?
copy 此特質(zhì)所表達(dá)的所屬關(guān)系與 strong 類似。然而設(shè)置方法并不保留新值,而是將其“拷貝”(copy)。 當(dāng)屬性類型為 NSString 時(shí),經(jīng)常用此特質(zhì)來保護(hù)其封裝性,因?yàn)閭鬟f給設(shè)置方法的新值有可能指向一個(gè) NSMutableString類的實(shí)例。這個(gè)類是 NSString的子類,表示一種可修改其值的字符串,此時(shí)若是不拷貝字符串,那么設(shè)置完屬性之后,字符串的值就可能會(huì)在對(duì)象不知情的情況下遭人更改。所以,這時(shí)就要拷貝一份“不可變”
(immutable)的字符串,確保對(duì)象中的字符串值不會(huì)無意間變動(dòng)。只要實(shí)現(xiàn)屬性所用的對(duì)象是“可變的” (mutable),就應(yīng)該在設(shè)置新屬性值時(shí)拷貝一份。
用 @property 聲明 NSString、NSArray、NSDictionary 經(jīng)常使用copy關(guān)鍵字,是因?yàn)樗麄冇袑?duì)應(yīng)的可變類型:NSMutableString、NSMutableArray、NSMutableDictionary,他們之間可能進(jìn)行賦值操作,為確保對(duì)象中的字符串值不會(huì)無意間變動(dòng),應(yīng)該在設(shè)置新屬性值時(shí)拷貝一份。
4.這個(gè)寫法會(huì)出什么問題: @property (copy) NSMutableArray *array; ??
兩個(gè)問題:
1、添加,刪除,修改數(shù)組內(nèi)的元素的時(shí)候,程序會(huì)因?yàn)檎也坏綄?duì)應(yīng)的方法而崩潰.因?yàn)?copy 就是復(fù)制一個(gè)不可變NSArray 的對(duì)象;
2、使用了 atomic 屬性會(huì)嚴(yán)重影響性能 ;
5.如何讓自己的類用 copy 修飾符?如何重寫帶 copy 關(guān)鍵字的setter?
? ? 若想令自己所寫的對(duì)象具有拷貝功能,則需實(shí)現(xiàn) NSCopying協(xié)議。如果自定義的對(duì)象分為可變版本與不可變版本,那么就要同時(shí)實(shí)現(xiàn) NSCopying 與 NSMutableCopying 協(xié)議。
具體步驟:
1.需聲明該類遵從 NSCopying 協(xié)議
2.實(shí)現(xiàn) NSCopying 協(xié)議。該協(xié)議只有一個(gè)方法:
6. @property的本質(zhì)是什么?ivar、getter、setter是如何生成并添加到這個(gè)類中的
1.@property的本質(zhì)是什么
@property的本質(zhì) = ivar (實(shí)例變量) + getter (取方法) +setter (存方法)
“屬性”(property)有兩大概念:實(shí)例變量(ivar)、存取方法(getter +setter)
2、ivar、 getter 、setter 是如何生成并添加到這個(gè)類中的
這是編譯器自動(dòng)合成的,通過@synthesize關(guān)鍵字指定,若不指定,默認(rèn)為@synthesize ?propertyName =_propertyName;若手動(dòng)實(shí)現(xiàn)了getter/setter 方法,則不會(huì)自動(dòng)合成。現(xiàn)在編譯器已經(jīng)默認(rèn)為我們添加了@synthesize ?propertyName= _propertyName;因此不再手動(dòng)添加了,除非你真的要改變成員變量名字。
生成getter方法時(shí),會(huì)判斷當(dāng)前屬性名是否有“_”,比如聲明屬性為@property(nonatomic,copy)NSString*_name;那么所生成的成員變量名就會(huì)變成“_name”,如果我們要手動(dòng)生成getter 方法,就要判斷是否以“_”開頭了。
7 .@protocol 和category 中如何使用 @property
在協(xié)議@protocol中使用@property只會(huì)生成setter和getter方法聲明,我們使用屬性的目的就是希望遵守我們協(xié)議的對(duì)象能夠?qū)崿F(xiàn)該屬性;
在分類category中使用@property 也是只會(huì)生成setter 和getter方法聲明,如果真需要個(gè)category增加屬性的實(shí)現(xiàn),需要借助于兩個(gè)運(yùn)行時(shí)的函數(shù)
//objc_setAssociatedObject
//objc_getAssociatedObject
8 .runtime 如何實(shí)現(xiàn) weak 屬性?
要實(shí)現(xiàn) weak 屬性,首先要搞清楚 weak 屬性的特點(diǎn):
weak此特質(zhì)表明該屬性定義了一種“非擁有關(guān)系” (nonowning relationship)。為這種屬性設(shè)置新值時(shí),設(shè)置方法既不保留新值,也不釋放舊值。此特質(zhì)同assign 類似, 然而在屬性所指的對(duì)象遭到摧毀時(shí),屬性值也會(huì)清空(nil out)。
那么 runtime如何實(shí)現(xiàn) weak 變量的自動(dòng)置nil?
runtime對(duì)注冊(cè)的類, 會(huì)進(jìn)行布局,對(duì)于 weak 對(duì)象會(huì)放入一個(gè) hash 表中。 用 weak 指向的對(duì)象內(nèi)存地址作為 key,當(dāng)此對(duì)象的引用計(jì)數(shù)為0的時(shí)候會(huì)dealloc,假如 weak 指向的對(duì)象內(nèi)存地址是a,那么就會(huì)以a為鍵, 在這個(gè) weak 表中搜索,找到所有以a為鍵的 weak 對(duì)象,從而設(shè)置為nil。
[※]@property中有哪些屬性關(guān)鍵字?
[※]weak屬性需要在dealloc中置nil么?
在ARC環(huán)境無論是強(qiáng)指針還是弱指針都無需在 dealloc 設(shè)置為 nil , ARC 會(huì)自動(dòng)幫我們處理
即便是編譯器不幫我們做這些,weak也不需要在 dealloc 中置nil.
[※※]@synthesize和@dynamic分別有什么作用?
synthesize,編譯器自動(dòng)生成setter和getter的方法,在你沒有手動(dòng)去實(shí)現(xiàn)這兩個(gè)方法時(shí)。
dynamic,告訴編譯器你會(huì)動(dòng)態(tài)生成setter和getter方法,不會(huì)要編譯器幫你生成。
@synthesize date=_date;這個(gè)一直很迷惑人,這個(gè)是幫你的屬性綁定一個(gè)成員變量。
現(xiàn)在已經(jīng)不需要寫synthesize。
[※※※]ARC下,不顯式指定任何屬性關(guān)鍵字時(shí),默認(rèn)的關(guān)鍵字都有哪些?
對(duì)應(yīng)基本數(shù)據(jù)類型默認(rèn)關(guān)鍵字是
atomic,readwrite,assign
對(duì)于普通的OC對(duì)象
atomic,readwrite,strong
[※※※]用@property聲明的NSString(或NSArray,NSDictionary)經(jīng)常使用copy關(guān)鍵字,為什么?如果改用strong關(guān)鍵字,可能造成什么問題?
因?yàn)楦割愔羔樋梢灾赶蜃宇悓?duì)象,使用 copy 的目的是為了讓本對(duì)象的屬性不受外界影響,使用 copy
無論給我傳入是一個(gè)可變對(duì)象還是不可對(duì)象,我本身持有的就是一個(gè)不可變的副本.
如果我們使用是 strong
,那么這個(gè)屬性就有可能指向一個(gè)可變對(duì)象,如果這個(gè)可變對(duì)象在外部被修改了,那么會(huì)影響該屬性.
copy 此特質(zhì)所表達(dá)的所屬關(guān)系與 strong
類似。然而設(shè)置方法并不保留新值,而是將其“拷貝” (copy)。 當(dāng)屬性類型為 NSString
時(shí),經(jīng)常用此特質(zhì)來保護(hù)其封裝性,因?yàn)閭鬟f給設(shè)置方法的新值有可能指向一個(gè) NSMutableString 類的實(shí)例。這個(gè)類是 NSString
的子類,表示一種可修改其值的字符串,此時(shí)若是不拷貝字符串,那么設(shè)置完屬性之后,字符串的值就可能會(huì)在對(duì)象不知情的情況下遭人更改。所以,這時(shí)就要拷貝一份“不可變”
(immutable)的字符串,確保對(duì)象中的字符串值不會(huì)無意間變動(dòng)。只要實(shí)現(xiàn)屬性所用的對(duì)象是“可變的” (mutable),就應(yīng)該在設(shè)置新屬性值時(shí)拷貝一份。
[※※※]@synthesize合成實(shí)例變量的規(guī)則是什么?假如property名為foo,存在一個(gè)名為_foo的實(shí)例變量,那么還會(huì)自動(dòng)合成新變量么?
[※※※※※]在有了自動(dòng)合成屬性實(shí)例變量之后,@synthesize還有哪些使用場(chǎng)景?
[※※]objc中向一個(gè)nil對(duì)象發(fā)送消息將會(huì)發(fā)生什么?
[※※※]objc中向一個(gè)對(duì)象發(fā)送消息[obj
foo]和objc_msgSend()函數(shù)之間有什么關(guān)系?
[※※※]什么時(shí)候會(huì)報(bào)unrecognized selector的異常?
[※※※※]一個(gè)objc對(duì)象如何進(jìn)行內(nèi)存布局?(考慮有父類的情況)
[※※※※]一個(gè)objc對(duì)象的isa的指針指向什么?有什么作用?