柚子快報(bào)激活碼778899分享:iOS Category
柚子快報(bào)激活碼778899分享:iOS Category
原理:
【iOS】——分類、擴(kuò)展和關(guān)聯(lián)對(duì)象_ios 為什么分類不能加成員變量-CSDN博客
面試題:
1.Category和Extension區(qū)別?
在 Objective-C 中,Category 和 Extension 是兩種用于向現(xiàn)有類添加新功能的機(jī)制,但它們各有特點(diǎn)和用途。以下是 Category 和 Extension 的主要區(qū)別:
Objective-C Category(分類)
目的與用途:
Category 主要用于向現(xiàn)有的類添加新的方法。它不能用于添加新的實(shí)例變量。 加載時(shí)機(jī):
Category 中的方法是在運(yùn)行時(shí)動(dòng)態(tài)添加到類的方法列表中。如果 Category 中的方法與原始類或其他 Category 中的方法同名,會(huì)產(chǎn)生覆蓋效果,最后編譯的 Category 會(huì)占據(jù)優(yōu)先權(quán)。 可見性:
Category 可以聲明在任何地方,它允許在不修改原始類定義的情況下添加新方法。Category 可以分布在不同的文件中,這有助于模塊化和分散類的實(shí)現(xiàn)。 頭文件:
Category 需要單獨(dú)的頭文件(.h)和實(shí)現(xiàn)文件(.m)。
Objective-C Extension(類擴(kuò)展)
目的與用途:
Extension 通常用于為類聲明私有屬性、方法或添加新的實(shí)例變量(在類的實(shí)現(xiàn)文件中)。Extension 是匿名的,通常在類的實(shí)現(xiàn)文件(.m 文件)中定義。 加載時(shí)機(jī):
Extension 中的方法和屬性是在編譯時(shí)合并到類的定義中的,和類本身的方法一樣。 可見性:
Extension 通常用于私有化目的,用于隱藏類的私有接口,不希望外部訪問(wèn)。 頭文件:
由于它們通常用于私有化目的,Extension 一般不需要單獨(dú)的頭文件。
共同點(diǎn)
兩者都用于為現(xiàn)有的類添加新功能。兩者都不能添加新的存儲(chǔ)屬性(實(shí)例變量),但 Extension 可以聲明屬性來(lái)添加對(duì)私有實(shí)例變量的訪問(wèn),只要這些實(shí)例變量是在類的主實(shí)現(xiàn)塊中聲明的。
主要區(qū)別
可見性和用途:Category 更適合公開地添加新方法,而 Extension 通常用于添加私有方法、屬性和實(shí)例變量。加載時(shí)機(jī):Category 的方法是在運(yùn)行時(shí)添加的,而 Extension 的方法在編譯時(shí)就已經(jīng)被合并到類中。添加實(shí)例變量:Extension 可以在類的實(shí)現(xiàn)文件中聲明新的實(shí)例變量,Category 則不能。
了解這些區(qū)別有助于在 Objective-C 開發(fā)中合理地使用 Category 和 Extension。在 Swift 中,由于不支持向現(xiàn)有類型添加存儲(chǔ)屬性,Category 和 Extension 的概念被統(tǒng)一為 Extensions,它們更加強(qiáng)大和靈活。
2.Category設(shè)計(jì)成不能添加屬性,這樣做有什么好處?
Objective-C 中 Category 的設(shè)計(jì)不允許直接添加實(shí)例變量或?qū)傩?,主要是出于以下幾個(gè)原因和考慮:
兼容性和安全性:Category 的主要用途是為現(xiàn)有的類添加新方法,而不是改變類的內(nèi)部狀態(tài)或結(jié)構(gòu)。如果允許在 Category 中添加實(shí)例變量,那么在運(yùn)行時(shí)對(duì)類的內(nèi)存布局進(jìn)行修改可能會(huì)引起嚴(yán)重的兼容性問(wèn)題,尤其是對(duì)于已經(jīng)在使用的類實(shí)例。不允許添加實(shí)例變量有助于保持類的內(nèi)部結(jié)構(gòu)穩(wěn)定和安全。 簡(jiǎn)化運(yùn)行時(shí)的實(shí)現(xiàn):Objective-C 的運(yùn)行時(shí)系統(tǒng)在加載類定義時(shí)會(huì)確定類的大小和布局。如果允許 Category 添加實(shí)例變量,運(yùn)行時(shí)系統(tǒng)就需要處理類布局的動(dòng)態(tài)變化,這將大大增加復(fù)雜性,并可能影響性能。不允許添加實(shí)例變量簡(jiǎn)化了運(yùn)行時(shí)的實(shí)現(xiàn)。 分離責(zé)任:Category 主要用于為類擴(kuò)展方法,而不是改變類的內(nèi)部表示。如果需要添加屬性和實(shí)例變量,應(yīng)該使用類的子類或擴(kuò)展(Extension)。擴(kuò)展可以向類添加私有的屬性和實(shí)例變量,但必須在類的主實(shí)現(xiàn)文件中定義。這種分離有助于代碼的組織和維護(hù)。 避免沖突:如果 Category 能夠添加實(shí)例變量,當(dāng)多個(gè) Category 嘗試添加同名的實(shí)例變量時(shí),沖突和不一致的情況將難以避免。這樣的設(shè)計(jì)有助于減少因沖突導(dǎo)致的錯(cuò)誤。
雖然 Category 不能直接添加實(shí)例變量,Objective-C 提供了關(guān)聯(lián)對(duì)象(Associated Objects)機(jī)制,允許開發(fā)者在運(yùn)行時(shí)關(guān)聯(lián)額外的數(shù)據(jù)到對(duì)象實(shí)例上。通過(guò)關(guān)聯(lián)對(duì)象,可以達(dá)到類似添加屬性的效果,但這種方式并不修改原有類的內(nèi)部結(jié)構(gòu),而是使用 Objective-C 運(yùn)行時(shí)的特性來(lái)實(shí)現(xiàn)。這種方法提供了靈活性,同時(shí)保持了類定義的穩(wěn)定和安全。
3.OC為什么不能添加屬性,這樣設(shè)計(jì)的好處是什么??
Objective-C 中 Category 的設(shè)計(jì)不允許直接添加實(shí)例變量或?qū)傩裕饕浅鲇谝韵聨讉€(gè)原因和考慮:
兼容性和安全性:Category 的主要用途是為現(xiàn)有的類添加新方法,而不是改變類的內(nèi)部狀態(tài)或結(jié)構(gòu)。如果允許在 Category 中添加實(shí)例變量,那么在運(yùn)行時(shí)對(duì)類的內(nèi)存布局進(jìn)行修改可能會(huì)引起嚴(yán)重的兼容性問(wèn)題,尤其是對(duì)于已經(jīng)在使用的類實(shí)例。不允許添加實(shí)例變量有助于保持類的內(nèi)部結(jié)構(gòu)穩(wěn)定和安全。 簡(jiǎn)化運(yùn)行時(shí)的實(shí)現(xiàn):Objective-C 的運(yùn)行時(shí)系統(tǒng)在加載類定義時(shí)會(huì)確定類的大小和布局。如果允許 Category 添加實(shí)例變量,運(yùn)行時(shí)系統(tǒng)就需要處理類布局的動(dòng)態(tài)變化,這將大大增加復(fù)雜性,并可能影響性能。不允許添加實(shí)例變量簡(jiǎn)化了運(yùn)行時(shí)的實(shí)現(xiàn)。 分離責(zé)任:Category 主要用于為類擴(kuò)展方法,而不是改變類的內(nèi)部表示。如果需要添加屬性和實(shí)例變量,應(yīng)該使用類的子類或擴(kuò)展(Extension)。擴(kuò)展可以向類添加私有的屬性和實(shí)例變量,但必須在類的主實(shí)現(xiàn)文件中定義。這種分離有助于代碼的組織和維護(hù)。 避免沖突:如果 Category 能夠添加實(shí)例變量,當(dāng)多個(gè) Category 嘗試添加同名的實(shí)例變量時(shí),沖突和不一致的情況將難以避免。這樣的設(shè)計(jì)有助于減少因沖突導(dǎo)致的錯(cuò)誤。
雖然 Category 不能直接添加實(shí)例變量,Objective-C 提供了關(guān)聯(lián)對(duì)象(Associated Objects)機(jī)制,允許開發(fā)者在運(yùn)行時(shí)關(guān)聯(lián)額外的數(shù)據(jù)到對(duì)象實(shí)例上。通過(guò)關(guān)聯(lián)對(duì)象,可以達(dá)到類似添加屬性的效果,但這種方式并不修改原有類的內(nèi)部結(jié)構(gòu),而是使用 Objective-C 運(yùn)行時(shí)的特性來(lái)實(shí)現(xiàn)。這種方法提供了靈活性,同時(shí)保持了類定義的穩(wěn)定和安全。
4.Swift中有Category嗎?
在 Swift 中,沒有名為 “Category” 的概念,但有一個(gè)類似的功能被稱為 “Extensions”。Swift 的 Extensions 與 Objective-C 中的 Categories 在某些方面類似,因?yàn)樗鼈兌荚试S開發(fā)者為現(xiàn)有類型添加新的功能,但是在 Swift 中 Extensions 功能更加強(qiáng)大和靈活。
Swift 的 Extensions 允許你為現(xiàn)有的類、結(jié)構(gòu)體、枚舉類型或者協(xié)議類型添加新的功能,這包括:
添加新的計(jì)算實(shí)例屬性和計(jì)算類型屬性定義實(shí)例方法和類型方法提供新的初始化器定義下標(biāo)定義和使用新的嵌套類型使現(xiàn)有類型遵循某個(gè)協(xié)議
與 Objective-C 的 Categories 不同,Swift 的 Extensions 可以添加計(jì)算屬性,但是它們?nèi)匀徊荒芴砑哟鎯?chǔ)屬性。如果你需要存儲(chǔ)額外的信息,你可以使用關(guān)聯(lián)對(duì)象,或者考慮使用其他設(shè)計(jì)模式,例如組合或繼承。
下面是一個(gè) Swift Extension 的示例:
extension String {
func reversedString() -> String {
return String(self.reversed())
}
}
let example = "Hello, World!"
let reversed = example.reversedString() // 輸出 "!dlroW ,olleH"
在這個(gè)例子中,我們?yōu)?String?類型添加了一個(gè)新的方法?reversedString,它會(huì)返回字符串的反向表示。這個(gè)方法可以被任何?String?實(shí)例調(diào)用,就像它是?String?類型原生支持的方法一樣。
Swift 的 Extensions 是 Swift 語(yǔ)言強(qiáng)大的特性之一,它們極大地增強(qiáng)了代碼的可擴(kuò)展性和復(fù)用性,同時(shí)也保持了類型安全和清晰的代碼結(jié)構(gòu)。
5.OC extension和Swift extension有什么區(qū)別
Objective-C 的 Extensions 和 Swift 的 Extensions 都是對(duì)現(xiàn)有類擴(kuò)展新功能的機(jī)制,但它們?cè)诟艔?、功能和限制上有一些重要區(qū)別:
概念和用途:
Objective-C Extensions?通常用于為類添加私有方法和屬性。它們只能在類的實(shí)現(xiàn)文件中定義,通常用來(lái)隱藏不想公開的接口。Swift Extensions?可以添加到類、結(jié)構(gòu)體、枚舉或協(xié)議等任何類型上,并且可以在任何地方定義。Swift 的擴(kuò)展更加靈活,可以用來(lái)添加新方法、計(jì)算屬性、嵌套類型、協(xié)議遵循等。 添加屬性:
Objective-C Extensions?可以添加新的實(shí)例變量和屬性,但只能在類的實(shí)現(xiàn)文件中的類擴(kuò)展部分做到這一點(diǎn)。Swift Extensions?不能添加存儲(chǔ)屬性(即帶有內(nèi)存存儲(chǔ)的屬性),但可以添加新的計(jì)算屬性。 方法添加:
在?Objective-C?中,添加新方法通常使用 Categories,而 Extensions 主要用于添加私有屬性和私有方法。Swift Extensions?可以添加新的實(shí)例方法和類型方法到現(xiàn)有類型。 位置和可見性:
Objective-C Extensions?需要在類的主實(shí)現(xiàn)文件中定義,它們的作用一般是私有的。Swift Extensions?可以在同一個(gè)項(xiàng)目的任何文件中定義,并且可以是私有的、公開的或者其他任何訪問(wèn)級(jí)別。 協(xié)議遵循:
Objective-C?中,通常不使用 Extensions 來(lái)使類遵循協(xié)議。Swift Extensions?經(jīng)常被用來(lái)添加協(xié)議遵循,甚至可以在擴(kuò)展中實(shí)現(xiàn)協(xié)議要求的方法。 類型修改:
Objective-C Extensions?不能用于擴(kuò)展其他類型,如結(jié)構(gòu)體或枚舉,因?yàn)?Objective-C 不支持這些類型。Swift Extensions?可以用來(lái)擴(kuò)展幾乎所有類型,包括類、結(jié)構(gòu)體、枚舉和協(xié)議。 可擴(kuò)展性:
Objective-C?的擴(kuò)展性主要受限于它的動(dòng)態(tài)特性和 Category 的設(shè)計(jì)。Swift?的設(shè)計(jì)更加現(xiàn)代和模塊化,使得 Extensions 更加強(qiáng)大和靈活。 OC extension和Swift extension加載時(shí)機(jī): 加載時(shí)機(jī)上實(shí)際上是一致的,因?yàn)樗鼈兌际窃诰幾g階段被合并到類定義中的,而不是在運(yùn)行時(shí)動(dòng)態(tài)加載。以下是兩者在加載時(shí)機(jī)上的具體描述: Objective-C Extensions(類擴(kuò)展) Objective-C 的類擴(kuò)展主要用于向類添加私有屬性、方法或者實(shí)例變量。類擴(kuò)展通常在類的實(shí)現(xiàn)文件(.m 文件)中聲明,它們的成員(包括屬性、方法等)在編譯時(shí)會(huì)被合并到類的定義中。這意味著,當(dāng)類被編譯時(shí),類擴(kuò)展中聲明的任何內(nèi)容都會(huì)成為類的一部分,就像直接寫在類的主體定義中一樣。所以,它們的加載時(shí)機(jī)就是編譯時(shí)。 Swift Extensions Swift 的 Extensions 允許你為現(xiàn)有類型添加新的方法、計(jì)算屬性、初始化器、下標(biāo)、協(xié)議遵循等。和 Objective-C 的類擴(kuò)展一樣,Swift 的擴(kuò)展在編譯時(shí)就會(huì)被合并到被擴(kuò)展的類型中。它們不會(huì)在運(yùn)行時(shí)改變類型的布局或動(dòng)態(tài)添加功能,而是在編譯階段就已經(jīng)確定了。這意味著,Swift 擴(kuò)展中的方法、計(jì)算屬性等也是在編譯時(shí)被集成到類型的定義中的。 總結(jié) 雖然 Objective-C 的類擴(kuò)展和 Swift 的擴(kuò)展用于不同的目的和有不同的功能,它們的加載時(shí)機(jī)都是在編譯時(shí),而不是運(yùn)行時(shí)。這與 Objective-C 的 Categories 不同,后者確實(shí)在運(yùn)行時(shí)動(dòng)態(tài)添加新方法。Swift 的擴(kuò)展和 Objective-C 的類擴(kuò)展都是在編譯時(shí)期就已經(jīng)確定的,它們?yōu)楝F(xiàn)有類型提供了額外的功能,但不改變類型的內(nèi)存布局。
總的來(lái)說(shuō),Swift 的 Extensions 提供了更多的功能和更大的靈活性。它們是 Swift 語(yǔ)言的一個(gè)核心特性,允許開發(fā)者以一種類型安全的方式來(lái)增強(qiáng)現(xiàn)有類型的功能,而不需要修改原始源代碼或繼承。Objective-C 的類擴(kuò)展功能較為有限,主要用于添加私有屬性和方法,以及在編譯時(shí)向類中添加新的實(shí)例變量。
柚子快報(bào)激活碼778899分享:iOS Category
相關(guān)閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。