第一篇

其實(shí)讀研之前,我一直都有寫東西記錄生活的習(xí)慣,不過以前可能會有點(diǎn)傻傻的,每隔一段時(shí)間寫一堆無病生吟的東西發(fā)表在QQZone,引來若干好友的稱贊,現(xiàn)在想來真是幼稚之極。為什么又開始寫這個(gè)呢,主要是來記錄和分享自己學(xué)習(xí)iOS的過程和心得吧,開始接觸大概有3個(gè)月了,刨去中間改論文備考公務(wù)員的一個(gè)月,實(shí)實(shí)在在的看書敲代碼應(yīng)該有一個(gè)多月吧,看了好多大神的技術(shù)博客,也在很多國外的網(wǎng)站上找到了自己所遇到問題的答案,我在學(xué)習(xí)的時(shí)候比較習(xí)慣用筆和紙來做記錄,于是考慮是不是可以把遇到的問題,學(xué)到的新知識,學(xué)習(xí)的點(diǎn)點(diǎn)滴滴在一個(gè)公開的地方記錄下來。昨天跑去面試時(shí)面試官也建議我要學(xué)會分享,算不上分享,更多是自己的記錄吧。

第一課我決定把昨天面試問到的一些問題總結(jié)一下,基本上之前看書都有看到過,可真正來解釋和回答的時(shí)候,發(fā)現(xiàn)還是很無力。

1.iOS中類別(Category)和擴(kuò)展(Extension)的區(qū)別。

在為系統(tǒng)類作擴(kuò)展的時(shí)候,我們可以不用繼承系統(tǒng)類,不需要訪問類的代碼,在不知道源代碼和不能修改的情況下,直接給系統(tǒng)類添加方法。

1) Category的方法不一定非要在@implementation中實(shí)現(xiàn),也可以在其他位置實(shí)現(xiàn),但是當(dāng)調(diào)用Category的方法時(shí),依據(jù)繼承樹沒有找到該方法的實(shí)現(xiàn),程序則會崩潰。

2) Category是類的擴(kuò)展,只能申明方法,不能申明變量。理論上不能添加變量,但是可以使用@dynamic來彌補(bǔ)這種不足。 (即運(yùn)行時(shí)Runtime)

3)類別的方法中,不可以調(diào)用super方法。

4)Category方法可能會覆蓋同一個(gè)class的其它c(diǎn)ategory方法,也可能被覆蓋,因?yàn)椴恢浪麄兗虞d的先后順序,出現(xiàn)這種情況在編譯的時(shí)候就會報(bào)錯(cuò)。如果在開發(fā)中使用了類別,最好保證類別名不同于使用者的類別名,類別方法名也不同于使用者的類別方法名。

5)下列情況下使用類別:對框架提供的擴(kuò)展;不想生成新的子類的情況下的擴(kuò)展;方便做項(xiàng)目管理,可以將一份源碼在多個(gè)地方共享或者做方法版本管理,多人協(xié)作開發(fā),用本地版本替換公共版本的實(shí)現(xiàn)。

擴(kuò)展是一種匿名分類;但是和匿名分類不一樣的是,擴(kuò)展可以添加新的實(shí)例變量。一般Extension都是放在.m文件的@implementation的上方,而且必須在@implementation中實(shí)現(xiàn),否則在編譯中會報(bào)錯(cuò)。

某些情況下,我們需要聲明一個(gè)@property,它對外是只讀的(readonly)而對內(nèi)是可讀寫的(readwrite),這時(shí),可以通過Extension實(shí)現(xiàn)。

2.__weak和__block的區(qū)別

這部分知識在block里有詳細(xì)講解,而且很重要,以后會專門用一篇來總結(jié)。

3.屬性關(guān)鍵字

NSString *pt = [[NSString alloc] initWithString:@"abc"];

上面一段代碼會執(zhí)行以下兩個(gè)動(dòng)作

1.在堆上分配一段內(nèi)存用來存儲@"abc"??比如:內(nèi)存地址為:0X1111?內(nèi)容為?"abc"

2.在棧上分配一段內(nèi)存用來存儲pt??比如:地址為:0Xaaaa?內(nèi)容自然為0X1111

assign的情況:NSString?*newPt?=?[pt?assign];

此時(shí)newPt和pt完全相同?地址都是0Xaaaa??內(nèi)容為0X1111??即newPt只是pt的別名,對任何一個(gè)操作就等于對另一個(gè)操作。?因此retainCount不需要增加。

retain的情況:NSString?*newPt?=?[pt?retain];

此時(shí)newPt的地址不再為0Xaaaa,可能為0Xaabb?但是內(nèi)容依然為0X1111。?因此newPt?和?pt?都可以管理"abc"所在的內(nèi)存。因此?retainCount需要增加1

copy的情況:NSString?*newPt?=?[pt?copy];

此時(shí)會在堆上重新開辟一段內(nèi)存存放@"abc"?比如0X1122?內(nèi)容為@"abc?同時(shí)會在棧上為newPt分配空間?比如地址:0Xaacc?內(nèi)容為0X1122?因此retainCount增加1供newPt來管理0X1122這段內(nèi)存。

assign:簡單賦值,不更改索引計(jì)數(shù)(Reference Counting)。對基礎(chǔ)數(shù)據(jù)類型 (NSInteger,CGFloat)和C數(shù)據(jù)類型(int, float, double, char, 等等)。

copy:建立一個(gè)索引計(jì)數(shù)為1的對象,然后釋放舊對象。對NSString,不能用于NSMutablestring。

retain:釋放舊的對象,將舊對象的值賦予輸入對象,再提高輸入對象的索引計(jì)數(shù)為1。釋放舊的對象,將舊對象的值賦予輸入對象,再提高輸入對象的索引計(jì)數(shù)為1。一般是用于字符串(NSString,NSMutableString),數(shù)組(NSMutableArray,NSArray),字典對象,視圖對象(UIView),控制器對象(UIViewController)等(NSObject及其子類)。

copy與retain的區(qū)別:(轉(zhuǎn))

copy是創(chuàng)建一個(gè)新對象,retain是創(chuàng)建一個(gè)指針,引用對象計(jì)數(shù)加1。Copy屬性表示兩個(gè)對象內(nèi)容相同,新的對象retain為1?,與舊有對象的引用計(jì)數(shù)無關(guān),舊有對象沒有變化。copy減少對象對上下文的依賴。

retain屬性表示兩個(gè)對象地址相同(建立一個(gè)指針,指針拷貝),內(nèi)容當(dāng)然相同,這個(gè)對象的retain值+1也就是說,retain?是指針拷貝,copy?是內(nèi)容拷貝。

當(dāng)然在iOS中并不是所有的對象都支持copy,mutableCopy,遵守NSCopying 協(xié)議的類可以發(fā)送copy消息,遵守NSMutableCopying 協(xié)議的類才可以發(fā)送mutableCopy消息。假如發(fā)送了一個(gè)沒有遵守上訴兩協(xié)議而發(fā)送 copy或者 mutableCopy,那么就會發(fā)生異常。但是默認(rèn)的iOS類并沒有遵守這兩個(gè)協(xié)議。如果想自定義一下copy 那么就必須遵守NSCopying,并且實(shí)現(xiàn) copyWithZone: 方法,如果想自定義一下mutableCopy 那么就必須遵守NSMutableCopying,并且實(shí)現(xiàn) mutableCopyWithZone: 方法。

strong:與retain類似

weak:與unsafe_unretained類似,可以避免野指針。

nonatomic:atomic是Objc使用的一種線程保護(hù)技術(shù),基本上來講,是防止在寫未完成的時(shí)候被另外一個(gè)線程讀取,造成數(shù)據(jù)錯(cuò)誤。而這種機(jī)制是耗費(fèi)系統(tǒng)資源的,所以在iPhone這種小型設(shè)備上,如果沒有使用多線程間的通訊編程,那么nonatomic是一個(gè)非常好的選擇。

3.深拷貝與淺拷貝

找到一篇特別詳細(xì)的解釋,地址如下:

IOS開發(fā)之深拷貝與淺拷貝(mutableCopy與Copy)詳解 - iPhone Dev - 博客園

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

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

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