iOS objective-c 基礎(chǔ)知識(shí)

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的指針指向什么?有什么作用?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容