其實讀研之前,我一直都有寫東西記錄生活的習慣瑰抵,不過以前可能會有點傻傻的乓搬,每隔一段時間寫一堆無病生吟的東西發(fā)表在QQZone,引來若干好友的稱贊,現(xiàn)在想來真是幼稚之極茴迁。為什么又開始寫這個呢,主要是來記錄和分享自己學習iOS的過程和心得吧酱塔,開始接觸大概有3個月了绳矩,刨去中間改論文備考公務員的一個月,實實在在的看書敲代碼應該有一個多月吧疟呐,看了好多大神的技術(shù)博客脚曾,也在很多國外的網(wǎng)站上找到了自己所遇到問題的答案,我在學習的時候比較習慣用筆和紙來做記錄启具,于是考慮是不是可以把遇到的問題本讥,學到的新知識,學習的點點滴滴在一個公開的地方記錄下來鲁冯。昨天跑去面試時面試官也建議我要學會分享拷沸,算不上分享,更多是自己的記錄吧薯演。
第一課我決定把昨天面試問到的一些問題總結(jié)一下撞芍,基本上之前看書都有看到過,可真正來解釋和回答的時候跨扮,發(fā)現(xiàn)還是很無力序无。
1.iOS中類別(Category)和擴展(Extension)的區(qū)別。
在為系統(tǒng)類作擴展的時候衡创,我們可以不用繼承系統(tǒng)類帝嗡,不需要訪問類的代碼,在不知道源代碼和不能修改的情況下璃氢,直接給系統(tǒng)類添加方法哟玷。
1) Category的方法不一定非要在@implementation中實現(xiàn),也可以在其他位置實現(xiàn)拔莱,但是當調(diào)用Category的方法時碗降,依據(jù)繼承樹沒有找到該方法的實現(xiàn)隘竭,程序則會崩潰。
2) Category是類的擴展讼渊,只能申明方法动看,不能申明變量。理論上不能添加變量爪幻,但是可以使用@dynamic來彌補這種不足菱皆。 (即運行時Runtime)
3)類別的方法中,不可以調(diào)用super方法挨稿。
4)Category方法可能會覆蓋同一個class的其它category方法仇轻,也可能被覆蓋,因為不知道他們加載的先后順序奶甘,出現(xiàn)這種情況在編譯的時候就會報錯篷店。如果在開發(fā)中使用了類別,最好保證類別名不同于使用者的類別名,類別方法名也不同于使用者的類別方法名臭家。
5)下列情況下使用類別:對框架提供的擴展;不想生成新的子類的情況下的擴展;方便做項目管理疲陕,可以將一份源碼在多個地方共享或者做方法版本管理,多人協(xié)作開發(fā)钉赁,用本地版本替換公共版本的實現(xiàn)蹄殃。
擴展是一種匿名分類;但是和匿名分類不一樣的是你踩,擴展可以添加新的實例變量诅岩。一般Extension都是放在.m文件的@implementation的上方,而且必須在@implementation中實現(xiàn)带膜,否則在編譯中會報錯吩谦。
某些情況下,我們需要聲明一個@property钱慢,它對外是只讀的(readonly)而對內(nèi)是可讀寫的(readwrite)逮京,這時,可以通過Extension實現(xiàn)束莫。
2.__weak和__block的區(qū)別
這部分知識在block里有詳細講解懒棉,而且很重要,以后會專門用一篇來總結(jié)览绿。
3.屬性關(guān)鍵字
NSString *pt = [[NSString alloc] initWithString:@"abc"];
上面一段代碼會執(zhí)行以下兩個動作
1.在堆上分配一段內(nèi)存用來存儲@"abc"??比如:內(nèi)存地址為:0X1111?內(nèi)容為?"abc"
2.在棧上分配一段內(nèi)存用來存儲pt??比如:地址為:0Xaaaa?內(nèi)容自然為0X1111
assign的情況:NSString?*newPt?=?[pt?assign];
此時newPt和pt完全相同?地址都是0Xaaaa??內(nèi)容為0X1111??即newPt只是pt的別名策严,對任何一個操作就等于對另一個操作。?因此retainCount不需要增加饿敲。
retain的情況:NSString?*newPt?=?[pt?retain];
此時newPt的地址不再為0Xaaaa妻导,可能為0Xaabb?但是內(nèi)容依然為0X1111。?因此newPt?和?pt?都可以管理"abc"所在的內(nèi)存。因此?retainCount需要增加1
copy的情況:NSString?*newPt?=?[pt?copy];
此時會在堆上重新開辟一段內(nèi)存存放@"abc"?比如0X1122?內(nèi)容為@"abc?同時會在棧上為newPt分配空間?比如地址:0Xaacc?內(nèi)容為0X1122?因此retainCount增加1供newPt來管理0X1122這段內(nèi)存倔韭。
assign:簡單賦值术浪,不更改索引計數(shù)(Reference Counting)。對基礎(chǔ)數(shù)據(jù)類型 (NSInteger寿酌,CGFloat)和C數(shù)據(jù)類型(int, float, double, char, 等等)胰苏。
copy:建立一個索引計數(shù)為1的對象,然后釋放舊對象醇疼。對NSString,不能用于NSMutablestring硕并。
retain:釋放舊的對象,將舊對象的值賦予輸入對象秧荆,再提高輸入對象的索引計數(shù)為1倔毙。釋放舊的對象,將舊對象的值賦予輸入對象乙濒,再提高輸入對象的索引計數(shù)為1陕赃。一般是用于字符串(NSString,NSMutableString)颁股,數(shù)組(NSMutableArray凯正,NSArray),字典對象豌蟋,視圖對象(UIView),控制器對象(UIViewController)等(NSObject及其子類)桑滩。
copy與retain的區(qū)別:(轉(zhuǎn))
copy是創(chuàng)建一個新對象梧疲,retain是創(chuàng)建一個指針,引用對象計數(shù)加1运准。Copy屬性表示兩個對象內(nèi)容相同幌氮,新的對象retain為1?,與舊有對象的引用計數(shù)無關(guān)胁澳,舊有對象沒有變化该互。copy減少對象對上下文的依賴。
retain屬性表示兩個對象地址相同(建立一個指針韭畸,指針拷貝)宇智,內(nèi)容當然相同,這個對象的retain值+1也就是說胰丁,retain?是指針拷貝随橘,copy?是內(nèi)容拷貝。
當然在iOS中并不是所有的對象都支持copy锦庸,mutableCopy机蔗,遵守NSCopying 協(xié)議的類可以發(fā)送copy消息,遵守NSMutableCopying 協(xié)議的類才可以發(fā)送mutableCopy消息。假如發(fā)送了一個沒有遵守上訴兩協(xié)議而發(fā)送 copy或者 mutableCopy,那么就會發(fā)生異常萝嘁。但是默認的iOS類并沒有遵守這兩個協(xié)議梆掸。如果想自定義一下copy 那么就必須遵守NSCopying,并且實現(xiàn) copyWithZone: 方法,如果想自定義一下mutableCopy 那么就必須遵守NSMutableCopying,并且實現(xiàn) mutableCopyWithZone: 方法牙言。
strong:與retain類似
weak:與unsafe_unretained類似酸钦,可以避免野指針。
nonatomic:atomic是Objc使用的一種線程保護技術(shù)嬉挡,基本上來講钝鸽,是防止在寫未完成的時候被另外一個線程讀取,造成數(shù)據(jù)錯誤庞钢。而這種機制是耗費系統(tǒng)資源的拔恰,所以在iPhone這種小型設(shè)備上,如果沒有使用多線程間的通訊編程基括,那么nonatomic是一個非常好的選擇颜懊。
3.深拷貝與淺拷貝
找到一篇特別詳細的解釋,地址如下: