国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【學(xué)習(xí)iOS高質(zhì)量開(kāi)發(fā)】——接口與API設(shè)計(jì)

這篇具有很好參考價(jià)值的文章主要介紹了【學(xué)習(xí)iOS高質(zhì)量開(kāi)發(fā)】——接口與API設(shè)計(jì)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。


一、用前綴避免命名空間沖突

1.為什么用前綴避免明明沖突

OC中沒(méi)有其他語(yǔ)言那種內(nèi)置的命名空間機(jī)制(namespace),所以我們?cè)趯?duì)文件命名時(shí)要避免潛在的命名沖突,若是發(fā)生重名沖突,那么應(yīng)用程序相應(yīng)的鏈接過(guò)程就會(huì)出錯(cuò),因?yàn)槠渲谐霈F(xiàn)了重復(fù)的符號(hào)。例如:
【學(xué)習(xí)iOS高質(zhì)量開(kāi)發(fā)】——接口與API設(shè)計(jì),ios,學(xué)習(xí),cocoa
這個(gè)錯(cuò)誤就是因?yàn)閮煞荽a都各自實(shí)現(xiàn)的EOCTheClass類導(dǎo)致該類所對(duì)應(yīng)的類符號(hào)和“元類”符號(hào)各定義了兩次。又恰好出現(xiàn)在同一個(gè)項(xiàng)目中并且重名,導(dǎo)致編譯器無(wú)法識(shí)別,而出錯(cuò)了。

比無(wú)法鏈接更糟糕的清況是,在運(yùn)行期載入了含有重名類的程序庫(kù)。此時(shí),“動(dòng)態(tài)加載器”就遭遇了“重名符號(hào)錯(cuò)誤”,很可能會(huì)令整個(gè)應(yīng)用程序崩潰。

2.應(yīng)當(dāng)如何避免

避免此問(wèn)題的唯一辦法就是變相實(shí)現(xiàn)命名空間:為所有名稱都加上適當(dāng)前綴。所選前綴可以是與公司、應(yīng)用程序或二者皆有關(guān)聯(lián)之名。即使加了前綴也可能出現(xiàn)命名沖突,但是幾率會(huì)小很多。

使用Cocoa創(chuàng)建應(yīng)用程序時(shí)一定要注意,Apple宣稱其保留使用所有“兩字母前綴”的權(quán)利,所以你自己選用的前綴應(yīng)該是三個(gè)字母的。

不僅是類名,應(yīng)用程序中的所有名稱都應(yīng)加前綴。如果要為既有類新增“分類”,那么一定要給“分類”及“分類”中的方法加上前綴,開(kāi)發(fā)者可能會(huì)忽視另外一個(gè)容易引起命名沖突的地方,那就是類的實(shí)現(xiàn)文件中所用的純C函數(shù)及全局變量,在編譯好的目標(biāo)文件中,這些名稱是要算做“頂級(jí)符號(hào)”的。

3.要點(diǎn)

  • 選擇與你的公司、應(yīng)用程序或者二者皆有關(guān)聯(lián)的名稱作為類名的前綴,并在所有代碼中均使用這一前綴。
  • 若是自己所開(kāi)發(fā)的程序庫(kù)中用到了第三方庫(kù),則應(yīng)為其中的名稱加上前綴。

二、提供“全能初始化方法”

1.什么是全能初始化方法

所有對(duì)象均要初始化。初始化時(shí),有些對(duì)象可能無(wú)須開(kāi)發(fā)者向其提供額外信息,不過(guò)一般來(lái)說(shuō)還是要提供的。以iOS的UI框架UIKit為例,其中有個(gè)類叫做UITableViewCell,初始化該類對(duì)象時(shí),需要指明其樣式及標(biāo)識(shí)符,標(biāo)識(shí)符能夠區(qū)分不同類型的單元格。由于這種對(duì)象的創(chuàng)建成本較高,所以繪制表格時(shí)可依照標(biāo)識(shí)符來(lái)復(fù)用,以提升程序效率。我們把這種可為對(duì)象提供必要信息以便其能完成工作的初始化方法叫做“全能初始化方法”。

如果創(chuàng)建類實(shí)例的方法不止一種,那么這個(gè)類就會(huì)有多個(gè)初始化方法。這當(dāng)然很好,不過(guò)仍然要在其中選定一個(gè)作為全能初始化方法,令其他初始化方法都來(lái)調(diào)用它。NSDate就是個(gè)例子,其初始化方法如下:

- (id)init
- (id)initWithString: (NSString *)string
- (id)initWithTimeIntervalSinceNow: (NSTimeInterval)seconds
- (id)initWithTimeInterval: (NSTimeInterval)seconds sinceDate: (NSDate *)refDate
- (id)initWithTimeIntervalSinceReferenceDate: (NSTimeInterval)seconds
- (id)initWithTimeIntervalSince1970: (NSTimeInterval)seconds

正如該類的文檔所描述的那樣,在上面幾個(gè)初始化方法中,“initWithTimeIntervalSinceReferenceDate:”是全能初始化方法。也就是說(shuō),其余的初始化方法都要調(diào)用它。于是,只有在全能初始化方法中,才會(huì)存儲(chǔ)內(nèi)部數(shù)據(jù)。這樣的話,當(dāng)?shù)讓訑?shù)據(jù)存儲(chǔ)機(jī)制改變時(shí),只需修改此方法的代碼就好,無(wú)須改動(dòng)其他初始化方法。
比如說(shuō),我們要編寫(xiě)一個(gè)表示矩形的類。其接口可以這樣寫(xiě):

#import <Foundation/Foundation.h>

@interface EOCRectangle : NSObject
@property (nonatomic, assign, readonly) float width;
@property (nonatomic, assign, readonly) float height;
@end


2.如何重寫(xiě)初始化方法

首先需要在你新的初始化方法中的調(diào)用這個(gè)類的“全能初始化方法”,如果他是繼承關(guān)系的話,那么就使用super來(lái)調(diào)用父類的初始化方法,調(diào)用結(jié)束之后就可以為想要實(shí)現(xiàn)的初始化方法添加邏輯,總而言之,全能初始化方法的調(diào)用鏈一定要維持。**如果子類的全能初始化方法與超類方法的名稱不同,我們總應(yīng)覆寫(xiě)超類的全能初始化方法,避免子類調(diào)用父類的全能初始化方法。**但是,有時(shí)候我們可能不想覆寫(xiě)超類的全能初始化方法,因?yàn)槟菢幼鰶](méi)有道理,那么我們就可以覆寫(xiě)超類的全能初始化方法,讓在調(diào)用這個(gè)方法的時(shí)候拋出異常,這樣就可以確保用戶一定使用的是你自己定義的方法了。

3.一個(gè)類有多個(gè)全能初始化方法要注意的問(wèn)題

通常我們遇到的類都只有一個(gè)全能初始化方法,但是偶爾也有類具有多個(gè)全能初始化方法。

由于這兩種初始化方法的解碼方式不同,而且我們也不能人為的改變其解碼的方式,那么我們就只能順其自然,他有兩種我們也重寫(xiě)兩種初始化方法,注意: 重寫(xiě)的這兩種初始化方法一定是分別調(diào)用過(guò)之前的兩種全能初始化方法的,并且表明這兩種新的初始化方法分別適用于那種情況。

反正,總的來(lái)說(shuō),我們就是要維持原來(lái)類的調(diào)用鏈,每個(gè)子類的全能初始化方法都應(yīng)該調(diào)用其超類的對(duì)應(yīng)方法,并逐層向上。因?yàn)槠涓割愑袃蓚€(gè)全能初始化方法,這兩種初始化方法定義出來(lái)的數(shù)據(jù)可能是不同的,若是你在子類中調(diào)用了錯(cuò)誤的父類初始化方法,它就會(huì)可能因?yàn)閿?shù)據(jù)類型的問(wèn)題使程序發(fā)生錯(cuò)誤。

3.要點(diǎn)

  • 在類匯總給你提供一個(gè)全能初始化方法,并與文檔里指明。其他初始化方法均應(yīng)調(diào)用此方法。
  • 若全能初始化方法與超類不同,則需覆寫(xiě)超類中的對(duì)應(yīng)方法。
  • 如果超類的初始化方法不適用于子類,那么應(yīng)該覆寫(xiě)這個(gè)超類方法,并在其中拋出異常。
  • 重寫(xiě)初始化方法也要注意如果子類的全能初始化方法與超類方法的名稱不同,我們總應(yīng)覆寫(xiě)超類的全能初始化方法,避免子類調(diào)用父類的全能初始化方法。

三、實(shí)現(xiàn)description方法

1.什么是description方法

在調(diào)試程序的的時(shí)候經(jīng)常要打印并查看對(duì)象信息。此時(shí)我們就可以用到description方法,其實(shí)description就是對(duì)這個(gè)對(duì)象本身的描述。例如:

NSLog(@"object = %@", object);

這里的description描述的內(nèi)容就會(huì)替代這個(gè)%@。又例如:

NSArray *object = @[@"A string", @(123)];
NSLog(@"object = %@", object);


這里會(huì)輸出:

object = {
	"A string"
	123
}


如果是一個(gè)自定義的類,那么它就會(huì)輸出該類的地址:

object = <EOCPerson: 0x7fd9a1600600>

這是因?yàn)槟悴](méi)有覆寫(xiě)其description方法,只有在自己的類里覆寫(xiě)description方法,這個(gè)對(duì)象的描述才會(huì)改變,否則打印信息時(shí)就會(huì)調(diào)用NSObject類所實(shí)現(xiàn)的默認(rèn)方法。例如:

- (NSString *) description {
	return [NSString stringWithFormat:@"<%@: %p, %@>",
			[self class],
			self,
			@{@"latitude":_title,
			@"latitude":@(_latitude),
			@"longitude":@(_longitude)}
		];
} 

輸出:
location = <EOCLocation: 0x7f98f2e01d20, {
	latitude = "51.506"
	longitude = 0;
	title = London;
}>

description沒(méi)有什么固定的套路輸出什么,就比如,你一個(gè)字符串的description和一個(gè)數(shù)組的description肯定是不一樣的,你肯定得根據(jù)你要輸出的對(duì)象來(lái)考慮description方法的。

2.在description方法中使用字典輸出

在自定義的description方法中,把待打印的信息放到字典里面,然后將字典對(duì)象的description方法所輸出的內(nèi)容包含在字符串里并返回,這樣就可以實(shí)現(xiàn)簡(jiǎn)易的信息輸出方式了。

3.什么是debugDescription

這個(gè)也是一種描述方法,和description差不多,就是描述的位置不一樣,description是在函數(shù)調(diào)用類的時(shí)候觸發(fā)方法才輸出的,而debugDescription是在控制臺(tái)中使用命令打印該對(duì)象時(shí)才調(diào)用的。當(dāng)然加斷點(diǎn)查看時(shí)也可以看到debugDescription的描述。

如果你在description不想將一些內(nèi)容輸出的話,你就可以將那些數(shù)據(jù)寫(xiě)在debugDescription中,讓程序員自己調(diào)試時(shí)可以方便的看到這些數(shù)據(jù),而description方法就輸出你想要讓用戶看到的信息就行。

4.要點(diǎn)

  • 實(shí)現(xiàn)description方法返回一個(gè)有意義的字符串,用以描述該實(shí)例。
  • 若想在調(diào)試時(shí)打印出更詳盡的對(duì)象描述信息,則應(yīng)實(shí)現(xiàn)debugDescription方法。

四、盡量使用不可變對(duì)象

1.什么是不可變對(duì)象

不可變對(duì)象,它指的是這個(gè)類里邊的屬性是不能直接被修改的,要實(shí)現(xiàn)這種功能,我們就需要用到我們的readonly(只讀)修飾符。默認(rèn)情況下,屬性是readwrite(即可讀又可寫(xiě))的,這樣修飾出來(lái)的類都是“可變的”。例如:


@property (nonatomic, copy, readonly) NSString *identifier; 
@property (nonatomic, copy, readonly) NSString *title;
@property (nonatomic, assign, readonly) float latitude;

有時(shí)可能想修改封裝在對(duì)象內(nèi)部的數(shù)據(jù),但是卻不想令這些數(shù)據(jù)為外人所改動(dòng)。這種情況下,通常的做法是在對(duì)象內(nèi)部將readonly屬性重新聲明為readwrite。當(dāng)然,如果該屬性是nonatomic的,那么這樣做可能會(huì)產(chǎn)生“競(jìng)爭(zhēng)條件”,即在對(duì)象內(nèi)部寫(xiě)入某屬性時(shí),對(duì)象外的觀察者也許正讀取該屬性。若想避免此問(wèn)題,我們可以在必要時(shí)通過(guò)“派發(fā)隊(duì)列”等手段,將(包括對(duì)象內(nèi)部的)所有數(shù)據(jù)存取操作都設(shè)為同步操作。就像這樣:

@property (nonatomic, copy, readwrite) NSString *identifier; 

現(xiàn)在,這個(gè)屬性就只能用在實(shí)現(xiàn)代碼內(nèi)部設(shè)置這些屬性了,但其實(shí),在對(duì)象外部還可以通過(guò)“鍵值編碼”技術(shù)來(lái)設(shè)置這些屬性,就像“setValue:forKey:”方法?!包c(diǎn)語(yǔ)法”也可以,因?yàn)辄c(diǎn)語(yǔ)法就是調(diào)用set方法的。這樣做雖說(shuō)可以改動(dòng),但是卻違背了本心,還會(huì)導(dǎo)致數(shù)據(jù)不同而出現(xiàn)問(wèn)題,所以不建議更改。

[pointOfInterest setValue:@"abc" forKey:@"identifier"];


這樣子可以改動(dòng)屬性值,因?yàn)镵VC會(huì)在類里查找“setIdentifier:”方法,并借此修改此屬性。即使沒(méi)有于公共接口中公布此方法,它也依然包含在類中。不過(guò),這樣做等于違規(guī)地繞過(guò)了本類所提供的API,要是開(kāi)發(fā)者使用這種“雜技代碼”的話,那么得自己開(kāi)應(yīng)對(duì)可能出現(xiàn)的問(wèn)題。
還有一種可以修改數(shù)據(jù)的方法就是直接用類型信息查詢功能查出屬性所對(duì)應(yīng)的實(shí)例變量在內(nèi)存布局中的偏移量,以此來(lái)人為設(shè)置這個(gè)實(shí)例變量的值。這樣做比繞過(guò)本類的公共API還要不合規(guī)范。所以不應(yīng)該因?yàn)檫@個(gè)原因而忽視所提的建議,大家還是要盡量編寫(xiě)不可變的對(duì)象。

2.要點(diǎn)

  • 盡量創(chuàng)建不可變的對(duì)象
  • 若某屬性進(jìn)可于對(duì)象內(nèi)部修改,則在“class-continuation分類”中將其由屬性擴(kuò)展為readwrite屬性
  • 不要把可變的collection作為屬性公開(kāi),而應(yīng)提供相關(guān)方法,以此修改對(duì)象中的可變collection

五、使用清晰而協(xié)調(diào)的命名方式

1.為什么使用清晰而協(xié)調(diào)的命名方式

命名時(shí)要簡(jiǎn)潔明了,讓用戶直接知道該方法是怎么使用的,這樣的好處就是,代碼讀起來(lái)像日常語(yǔ)言里的句子。我們通常使用“駝峰命名法”,就是以小寫(xiě)字母開(kāi)頭,其后每個(gè)單詞首字母大寫(xiě),不論是類還是屬性都可以這樣命名。

2.命名規(guī)則

方法命名的規(guī)則:

  • 如果方法的返回值是新創(chuàng)建的,那么方法名的首個(gè)詞應(yīng)是返回值的類型,除非前面還 有修飾語(yǔ),例如localized String。屬性的存取方法 不遵循這種命名方式,因?yàn)橐话阏J(rèn) 為這些方法不會(huì)創(chuàng)建新對(duì)象,即便有時(shí)返回內(nèi)部對(duì)象的一份拷貝, 我們也認(rèn)為那相當(dāng) 于原有的對(duì)象。這些存取方法應(yīng)該按照其所對(duì)應(yīng)的屬性來(lái)命名。
  • 應(yīng)該把表示參數(shù)類型的名詞放在參數(shù)前面。
  • 如果方法要在當(dāng)前對(duì)象上執(zhí)行操作,那么就應(yīng)該包含動(dòng)詞;若執(zhí)行操作時(shí)還需要參數(shù), 則應(yīng)該在動(dòng)詞后面加 上一個(gè)或多個(gè)名詞。
  • 不要使用str 這種簡(jiǎn)稱,應(yīng)該用string 這樣的全稱。
  • Boolean 屬性應(yīng)加is 前綴。如果某方法返回非屬性的Boolean 值,那么應(yīng)該根據(jù)其功 能,選用has 或is 當(dāng)前綴。
  • 將get 這個(gè)前綴留給那些借由“輸出參數(shù)〞來(lái)保存返回值的方法,比如說(shuō),把返回值填充到〝C語(yǔ)言式數(shù)組” ( C - style array ) 里的那種方法就可以使用這個(gè)詞做前綴 。

類與協(xié)議的命名規(guī)則:

應(yīng)該為類與協(xié)議的名稱加上前綴,以避免命名空間沖突,而且應(yīng)該像給方法起名時(shí)那樣把詞句組織好,使其從左至右讀起來(lái)較為通順。基本命名規(guī)則就是:命名方式應(yīng)該一致,如果要從其他的類中繼承子類,那么就要遵守其原本的命名慣例。 例如:UIView它的子類就應(yīng)該是***View,表明其來(lái)歷。

3.要點(diǎn)

  • 起名時(shí)應(yīng)遵從標(biāo)準(zhǔn)的OC命名規(guī)范,這樣創(chuàng)建出來(lái)的接口更容易為開(kāi)發(fā)者所理解。
  • 方法名要言簡(jiǎn)意賅,從左至右讀起來(lái)要像個(gè)日常用語(yǔ)中的句子才好。
  • 方法名里不要使用縮略后的類型名稱。
  • 給方法名起名時(shí)的第一要?jiǎng)?wù)就是確保其風(fēng)格與你自己的代碼或所要集成的框架相符。

六、為私有方法名加前綴

1.為什么

通常我們?cè)趯?xiě)方法時(shí),并沒(méi)有對(duì)其進(jìn)行私有共有分類,導(dǎo)致調(diào)試時(shí)可能很麻煩,現(xiàn)在為私有方法加上前綴,這樣便于修改方法或方法簽名。唯一注意的是:一定不要只使用_作為前綴,因?yàn)樘O(píng)果公司使用的就是_作為私有方法的前綴的,你自己定義的私有方法名有可能就會(huì)和人家自帶的沖突。

駝峰命名法

方法和變量名的首個(gè)單詞的首個(gè)字母小寫(xiě),然后后面的每個(gè)單詞的首字母大寫(xiě)。類名也用駝峰命名法,另外,類名一般還有三個(gè)前綴字母。

2.要點(diǎn)

  • 給私有方法的名稱加上前綴,這樣可以很容易地將其同公共方法區(qū)分開(kāi)。
  • 不要單用一個(gè)下劃線做私有方法的前綴,因?yàn)檫@種做法是預(yù)留給蘋(píng)果公司用的。

七、理解Objective-C錯(cuò)誤模型

1.如何理解

當(dāng)前很多編程語(yǔ)言都有“異?!保╡xception)機(jī)制,OC也不例外。
首先要注意的是,“自動(dòng)引用計(jì)數(shù)”(Automatic Reference Counting, ARC)在默認(rèn)情況下不是“異常安全的”(exception safe)。具體來(lái)說(shuō),這意味著:如果拋出異常,那么本應(yīng)在作用域末尾釋放的對(duì)象現(xiàn)在不會(huì)自動(dòng)釋放了。如果想生成“異常安全”的代碼,可以通過(guò)設(shè)置編譯器的標(biāo)志來(lái)實(shí)現(xiàn),不過(guò)這將引入一些額外代碼,在不拋出異常時(shí),也照樣要執(zhí)行這部分代碼。需要打開(kāi)的編譯器標(biāo)志叫做-fobjc-arc-exceptions??墒窃卺尫刨Y源之前如果拋出異常了,那么該資源就不會(huì)被釋放了:

id someResource = /*...*/;
if (/*check for error*/) {
	@throw [NSException exceptionWithName:@"ExceptionName" reason:@"There was an error" userInfo:nil];
}
[someResource doSomething];
[someResource release];


在拋出異常前先釋放someResource,這樣做當(dāng)然能解決此問(wèn)題,不過(guò)要是待釋放的資源有很多,而且代碼的執(zhí)行路徑更為復(fù)雜的話,那么釋放資源的代碼就容易寫(xiě)的很亂。此外,代碼中加入了新的資源之后,開(kāi)發(fā)者經(jīng)常會(huì)忘記在拋出異常前先把它釋放掉。
OC語(yǔ)言現(xiàn)在采用的方法是:只在極其罕見(jiàn)的情況下拋出異常,異常拋出之后,無(wú)須考慮恢復(fù)問(wèn)題,而且應(yīng)用程序此時(shí)也應(yīng)該退出。也就是說(shuō),不用再編寫(xiě)復(fù)雜的“異常安全”的代碼了。
異常只用來(lái)處理嚴(yán)重錯(cuò)誤(fatal error,致命錯(cuò)誤);對(duì)于“不那么嚴(yán)重的錯(cuò)誤”(nonfatal error,非致命錯(cuò)誤),OC語(yǔ)言所采用的編程范式為:令方法返回nil/0,或是使用NSError,以表明其中有錯(cuò)誤發(fā)生。例如:

 - (id)initWithValue:(id)value {
	if (self = [super init]) {
		if (/*Value means instance can't be created*/) {
			self = nil;
		} else {
			//Initialize instance
		}
	}
	return self;
}

這種情況下,如果if語(yǔ)句發(fā)現(xiàn)無(wú)法用傳入的參數(shù)值來(lái)初始化當(dāng)前實(shí)例,那么就把self設(shè)置成nil,這樣的話,整個(gè)方法的返回值也就是nil了。調(diào)用者發(fā)現(xiàn)初始化方法并沒(méi)有2把實(shí)例創(chuàng)建好,于是便可以知道其中發(fā)生了錯(cuò)誤。
NSError的用法更加靈活,因?yàn)榻?jīng)由此對(duì)象,我們可以把導(dǎo)致錯(cuò)誤的原因回報(bào)給調(diào)用者。NSError對(duì)象里封裝了三條消息:

  1. Error domain(錯(cuò)誤范圍,類型為字符串)產(chǎn)生錯(cuò)誤的根源,通常用一個(gè)特有的全局變量來(lái)定義。
  2. Error code(錯(cuò)誤碼,類型為整數(shù))獨(dú)有的錯(cuò)誤代碼,用以指明在某個(gè)范圍內(nèi)具體發(fā)生了何種錯(cuò)誤。某個(gè)特定范圍可能會(huì)發(fā)生一系列相關(guān)錯(cuò)誤,這些錯(cuò)誤通常采用enum定義。
  3. User info(用戶信息,類型為字典)有關(guān)錯(cuò)誤的額外信息,其中或許包含一段“本地化描述”(localized description),或許還含有導(dǎo)致該錯(cuò)誤發(fā)生的另外一個(gè)錯(cuò)誤,經(jīng)由此種信息,可將相關(guān)錯(cuò)誤串成一條“錯(cuò)誤鏈”(chain of errors)。

2.要點(diǎn)

  • 只有發(fā)生了可使整個(gè)應(yīng)用程序崩潰的嚴(yán)重錯(cuò)誤時(shí),才應(yīng)使用異常。
  • 在錯(cuò)誤不那么嚴(yán)重的情況下,可以指派“委托方法”來(lái)處理錯(cuò)誤,也可以把錯(cuò)誤信息放在NSError對(duì)象里,經(jīng)由“輸出參數(shù)”返回給調(diào)用者。

八、理解NSCopying協(xié)議

1.什么是NSCopying協(xié)議

我們經(jīng)常會(huì)使用copy函數(shù),但是若是你自定義的類,他自己就不會(huì)實(shí)現(xiàn)這個(gè)函數(shù),此時(shí)就需要你自己來(lái)實(shí)現(xiàn)了,要實(shí)現(xiàn)copy函數(shù)就的實(shí)現(xiàn)NSCopying協(xié)議,該協(xié)議只有一個(gè)方法:- (id)copyWithZone:(NSZone *)zone;
可以看到方法中有個(gè)參數(shù)為zone因?yàn)橐郧伴_(kāi)發(fā)程序時(shí),會(huì)據(jù)此把內(nèi)存分成不同的“區(qū)”,而對(duì)象會(huì)創(chuàng)建在某個(gè)區(qū)里?,F(xiàn)在不用了,每個(gè)程序只有一個(gè)區(qū):“默認(rèn)區(qū)”。所以說(shuō),盡管必須實(shí)現(xiàn)這個(gè)方法,到那時(shí)你不必?fù)?dān)心其中的zone參數(shù)。

copy方法由NSObject實(shí)現(xiàn),該方法只是以“默認(rèn)區(qū)”為參數(shù)來(lái)調(diào)用“copyWithZone:”。所以要實(shí)現(xiàn)copy函數(shù),他才是關(guān)鍵。
想要重寫(xiě)copy函數(shù),要聲明該類遵從NSCopying協(xié)議,并實(shí)現(xiàn)其中的方法。

#import <Foundation/Foundation.h>
@interface EOCPerson : NSObject <NSCopying>
@property (nonatomic, copy, readonly) NSString *firstName; @property (nonatomic, copy, readonly) NSString *lastName;
- (id) initwithFirstName: (NSString*)firstName andLastName: (NSString*) lastName;
@end

實(shí)現(xiàn)協(xié)議中規(guī)定的方法:

- (id) copyWithZone: (NSZone*)zone {
	EOCPerson *copy = [[[self class] allocWithZone: zone] initwithFirstName: firstName andLastName: lastName];
	return copy; 
}

2.深拷貝和淺拷貝

深拷貝:在拷貝對(duì)象自身時(shí),將其底層數(shù)據(jù)也一并復(fù)制過(guò)去。
淺拷貝:在拷貝對(duì)象自身時(shí),只拷貝容器對(duì)象本身,而不復(fù)制其中的數(shù)據(jù)。
【學(xué)習(xí)iOS高質(zhì)量開(kāi)發(fā)】——接口與API設(shè)計(jì),ios,學(xué)習(xí),cocoa
【學(xué)習(xí)iOS高質(zhì)量開(kāi)發(fā)】——接口與API設(shè)計(jì),ios,學(xué)習(xí),cocoa文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-830782.html

3.要點(diǎn)

  • 若想令自己所寫(xiě)的對(duì)象具有拷貝功能,則需實(shí)現(xiàn)NSCopying協(xié)議。
  • 如果自定義的對(duì)象分為可變版本和不可變版本,那么就要同時(shí)實(shí)現(xiàn)NSCopying與NSMutableCopying協(xié)議。
  • 復(fù)制對(duì)象時(shí)需決定采用淺拷貝還是深拷貝,一般情況下應(yīng)該盡量執(zhí)行淺拷貝。
  • 如果你所寫(xiě)的對(duì)象需要深拷貝,那么可考慮新增一個(gè)專門(mén)執(zhí)行深拷貝的方法。

到了這里,關(guān)于【學(xué)習(xí)iOS高質(zhì)量開(kāi)發(fā)】——接口與API設(shè)計(jì)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 各類Java高質(zhì)量學(xué)習(xí)網(wǎng)址

    1. Oracle官方Java學(xué)習(xí)網(wǎng)站:https://www.oracle.com/java/technologies/javase-downloads.html 2. Java編程思想:https://www.mindviewinc.com/Books/downloads.html 3. Java在線教程(TutorialsPoint):https://www.tutorialspoint.com/java/index.htm 4. Java API文檔:https://docs.oracle.com/en/java/javase/14/docs/api/index.html 5. Java開(kāi)發(fā)者社區(qū)(

    2024年02月03日
    瀏覽(27)
  • 用“博弈論”看什么是高質(zhì)量的代幣設(shè)計(jì)?

    用“博弈論”看什么是高質(zhì)量的代幣設(shè)計(jì)?

    在每個(gè)領(lǐng)域,都有國(guó)王,皇后,小兵和其他玩家。它們決定了該行業(yè)賴以生存的質(zhì)量和標(biāo)準(zhǔn)。在同一領(lǐng)域,必然有贏家和輸家。對(duì)于加密貨幣和代幣經(jīng)濟(jì)來(lái)說(shuō),情況也是如此。本文的重點(diǎn)是代幣經(jīng)濟(jì)的博弈論。它涉及游戲本身、誰(shuí)在玩游戲、游戲規(guī)則和游戲模型。讓我們了解

    2024年02月02日
    瀏覽(92)
  • 探索 StableDiffusion:生成高質(zhì)量圖片學(xué)習(xí)及應(yīng)用

    探索 StableDiffusion:生成高質(zhì)量圖片學(xué)習(xí)及應(yīng)用

    本文主要介紹了 StableDiffusion在圖片生成上的內(nèi)容,然后詳細(xì)說(shuō)明了StableDiffusion 的主要術(shù)語(yǔ)和參數(shù),并探討了如何使用 prompt 和高級(jí)技巧(如圖像修復(fù)、訓(xùn)練自定義模型和圖像編輯)來(lái)生成高質(zhì)量的圖片。 介紹StableDiffusion ? ?? StableDiffusion是什么 Stable Diffusion是一種潛在的文

    2024年02月09日
    瀏覽(21)
  • Midjourney入門(mén)指南:簡(jiǎn)單提示詞,搞定高質(zhì)量應(yīng)用設(shè)計(jì)

    Midjourney入門(mén)指南:簡(jiǎn)單提示詞,搞定高質(zhì)量應(yīng)用設(shè)計(jì)

    Midjourney是一款文本到圖像的AI工具,可以根據(jù)純文本描述生成圖片,例如UI屏幕、應(yīng)用程序圖標(biāo)、產(chǎn)品圖片、標(biāo)志和吉祥物等。雖然它不能替代UI設(shè)計(jì)師,但它可以在產(chǎn)品設(shè)計(jì)和視覺(jué)探索的早期階段成為有幫助的工具。要使用Midjourney,您需要加入Discord,并編寫(xiě)清晰的提示,闡

    2024年02月06日
    瀏覽(91)
  • 開(kāi)源 ChatFlow:讓人類設(shè)計(jì)高質(zhì)量流程,讓 ChatGPT 生成與復(fù)讀

    開(kāi)源 ChatFlow:讓人類設(shè)計(jì)高質(zhì)量流程,讓 ChatGPT 生成與復(fù)讀

    太長(zhǎng)不讀版:ChatFlow 作為一個(gè)正經(jīng)的開(kāi)源項(xiàng)目,現(xiàn)在你可以在 ClickPrompt 上完成一切工作以外的活動(dòng):角色扮演、玩游戲、看小說(shuō)、AI 畫(huà)畫(huà)等等,如下圖所示: 于是,我們抽取 ClickPrompt 出了的核心能力,構(gòu)建了一個(gè)新的框架:ChatFlow —— 一個(gè)圍繞 ChatGPT 構(gòu)建的簡(jiǎn)易工作流引擎

    2023年04月21日
    瀏覽(640)
  • 國(guó)外11個(gè)高質(zhì)量免費(fèi)的3D素材網(wǎng)站-建筑設(shè)計(jì)/室內(nèi)設(shè)計(jì)/效果圖渲染

    國(guó)外11個(gè)高質(zhì)量免費(fèi)的3D素材網(wǎng)站-建筑設(shè)計(jì)/室內(nèi)設(shè)計(jì)/效果圖渲染

    Renderbus瑞云效果圖云渲染 小編小瑞又來(lái)給大家分享國(guó)內(nèi)外效果圖及云渲染行業(yè)的前沿資訊啦!今天給大家分享11個(gè)國(guó)外免費(fèi)的3D素材網(wǎng)站!幫助建筑設(shè)計(jì)/室內(nèi)設(shè)計(jì)/效果圖渲染的小伙伴,在 Photoshop、Revit、Sketchup、AutoCAD 、3ds Max 等其他3D建模應(yīng)用程序上創(chuàng)建逼真的 3D 模型! 在

    2023年04月11日
    瀏覽(94)
  • React.js 中用于高質(zhì)量應(yīng)用程序的最佳實(shí)踐和設(shè)計(jì)模式

    原文:Best Practices and Design Patterns in React.js for High-Quality Applications,適當(dāng)增刪 原作者:Ori Baram 文章已獲原文作者授權(quán),禁止轉(zhuǎn)載和商用 不按文件類型對(duì)組件進(jìn)行分組,而是按特征。示例: 小而集中的組件易于理解,維護(hù)和測(cè)試。 假設(shè)您有一個(gè)UserProfile組件代碼體積逐漸變大

    2024年02月15日
    瀏覽(93)
  • 推薦幾個(gè)親測(cè)好用高質(zhì)量學(xué)習(xí)SQL的網(wǎng)站(建議收藏)

    推薦幾個(gè)親測(cè)好用高質(zhì)量學(xué)習(xí)SQL的網(wǎng)站(建議收藏)

    打開(kāi)我的收藏夾,找出我曾經(jīng)苦苦尋覓但卻塵封已久的小網(wǎng)站—— 想什么呢,是正經(jīng)學(xué)習(xí)SQL的網(wǎng)站,看完趕緊收藏學(xué)習(xí)起來(lái)! LintCode是我常用來(lái)刷算法題的網(wǎng)站,最近他們開(kāi)發(fā)了一個(gè) SQL教程 模塊特好用,很適合零基礎(chǔ)從0-1學(xué)習(xí)SQL。 這不只是單純的刷題工具,而是先跟你梳理

    2024年02月13日
    瀏覽(28)
  • 《Effective Python 編寫(xiě)高質(zhì)量Python代碼的59個(gè)有效方法》學(xué)習(xí)筆記2

    盡量用enumerate取代range 用zip()同時(shí)遍歷兩個(gè)迭代器 合理使用try-except-else-finally 如果既要異常向上傳播,又要在異常發(fā)生時(shí)執(zhí)行清理工作,可使用try/finally結(jié)構(gòu) try/except/else結(jié)構(gòu)可以清晰描述哪些異常由自己的代碼處理,哪些傳播到上一級(jí) 無(wú)論try塊是否異常,都可用try/finally復(fù)合

    2023年04月25日
    瀏覽(95)
  • 學(xué)科在線教育元宇宙VR虛擬仿真平臺(tái)落實(shí)更高質(zhì)量的交互學(xué)習(xí)

    學(xué)科在線教育元宇宙VR虛擬仿真平臺(tái)落實(shí)更高質(zhì)量的交互學(xué)習(xí)

    為推動(dòng)教育數(shù)字化,建設(shè)全民終身學(xué)習(xí)的學(xué)習(xí)型社會(huì)、學(xué)習(xí)型大國(guó),元宇宙企業(yè)深圳華銳視點(diǎn)深度融合VR虛擬現(xiàn)實(shí)、數(shù)字孿生、云計(jì)算和三維建模等技術(shù),搭建教育元宇宙平臺(tái),為學(xué)生提供更加沉浸式的學(xué)習(xí)體驗(yàn),提高學(xué)習(xí)效果和興趣,成為教研創(chuàng)新的著力點(diǎn)。 一、虛擬實(shí)驗(yàn)

    2024年02月13日
    瀏覽(25)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包