回顧一下OC基礎(chǔ)

// 1. weak與assign之間的區(qū)別
/* 我的看法:
 * 使用:
 * 1> weak在循環(huán)引用中能使一方釋放引用蛤袒,從而解決循環(huán)的問(wèn)題,比如delegate烤礁,block內(nèi)
 * 2> 如果有一方已經(jīng)強(qiáng)引用一個(gè)OC對(duì)象霹购,則在另一方引用就不需要強(qiáng)引用璃搜,使用weak即可熬苍,避免重復(fù)引用换淆,比如UI控件
 * 不同:
 * 1> weak其實(shí)和assign一樣心褐,都只是簡(jiǎn)單的生成seter摄职、getter方法誊役,而并不會(huì)對(duì)setter方法進(jìn)行其他的操作,這是相同點(diǎn)谷市。
      同時(shí)蛔垢,weak在一個(gè)運(yùn)行循環(huán)結(jié)束后,銷(xiāo)毀對(duì)象時(shí)迫悠,會(huì)自動(dòng)將weak對(duì)象置nil鹏漆。
 * 2> weak只能用于OC,assign可以用做Foundation的基本數(shù)據(jù)類(lèi)型创泄。
 */

// 2. 怎么使用copy關(guān)鍵字
/** 我的看法:
 *  使用:
 *  1> 在屬性是NSString(NSArray艺玲、NSDictionary)時(shí),需要使用copy內(nèi)存管理鞠抑。
 *  2> block也基本采用copy饭聚,雖然block使用assign創(chuàng)建或strong、weak也行搁拙,只是當(dāng)ta一創(chuàng)建則被ARC放進(jìn)了堆中(執(zhí)行了copy
       操作)
 *  為何秒梳?
 *  1> 如果使用strong,則會(huì)對(duì)NSString進(jìn)行強(qiáng)引用感混,而不做其他操作,這會(huì)導(dǎo)致如果是NSMuttableString礼烈,則在本屬性不知情的情
       況下弧满,更改了內(nèi)存中的值,比如增刪改此熬。
 *  2> 如果是weak庭呜,在沒(méi)有其他強(qiáng)引用指向時(shí)滑进,則創(chuàng)建即銷(xiāo)毀。
 *  3> 如果采用copy募谎,則不會(huì)造成在屬性不知情的情況下扶关,更新其內(nèi)存中的值,確保值的唯一性数冬。
 */

// 3. 這個(gè)寫(xiě)法會(huì)出什么問(wèn)題: @property (copy) NSMutableArray *array;
/** 我的看法:
 *  1> 使用copy操作后节槐,則將可變copy成一份不可變對(duì)象,那么就保證了值了唯一性拐纱,不會(huì)執(zhí)行增刪改的操作铜异。
 *  2> atomin具有同步鎖的功能,但同步鎖的效果不好秸架,而且在setter方法中加了一些不必要的代碼揍庄,造成了性能損失,因此一般采用
       nonatomic东抹,并且同步鎖的的功能應(yīng)該采用其他機(jī)制蚂子,比如@singnized,NSLock缭黔,信號(hào)量等
 */

// 4. 如何讓自己的類(lèi)具有copy修飾符食茎?如何重寫(xiě)帶copy的關(guān)鍵字setter?
//   這個(gè)太復(fù)雜试浙,下一個(gè)董瞻,可自行g(shù)oogle

// 5. @property的本質(zhì)是什么,ivar田巴、getter钠糊、setter是如何添加到類(lèi)中的?
/** 我的看法:
 *  property = ivar + setter + getter
 *  ivar + setter + getter 是在編譯過(guò)程中壹哺,編譯器自動(dòng)生成的抄伍,并且將ivar添加進(jìn)了ivarlist中,setter管宵、getter方法添加
    進(jìn)了methodlist中截珍,property的描述添加進(jìn)了propertylist方法中,并且添加了對(duì)象的偏移量箩朴,這個(gè)是硬編碼岗喉,就是property在
    內(nèi)存中的位置,并以后通過(guò)這個(gè)偏移量來(lái)訪問(wèn)其值炸庞。
 */

// 6. @protocol和category中如何試用@property
/** 我的看法:
 *  1> 在protocol中添加屬性钱床,則只會(huì)生成ivar以及setter、getter的聲明埠居,而在遵循此protocol中實(shí)現(xiàn)它們
 *  2> 在category中添加屬性查牌,則只會(huì)生成ivar事期,而getter、setter方法需要用運(yùn)行時(shí)objc_getAssio..以及objc_setAssio..
       來(lái)實(shí)現(xiàn)纸颜。
 */

// 7. runtime如何實(shí)現(xiàn)weak兽泣?
/** 我的看法:(比較粗略)
 *  將weak對(duì)象和指針?lè)湃胍粋€(gè)weak表中,如果對(duì)象的強(qiáng)引用為0胁孙,則將此weak移出weak表唠倦,并將ta在運(yùn)行循環(huán)結(jié)束時(shí)銷(xiāo)毀
 */

// 8. @property有哪些修飾符?并且有哪些關(guān)鍵字浊洞?
/** 我的看法:
 *  1> 原子性: (atomic默認(rèn), nonatomic)
 *  2> 可讀可寫(xiě)性: (readwrite默認(rèn), readonly)
 *  3> 內(nèi)存管理: assign牵敷、strong、weak法希、copy枷餐、unsafe_unretained
 *  4> setter<name>、getter<name>的方法名更改
 *  5> 修飾符有一些不常用的苫亦,比如nonnull毛肋、null_resettable、nullable
 */

// 9. weak屬性需要dealloc時(shí)屋剑,置nil嗎润匙?
/** 我的看法:
 *  不需要,在ARC中唉匾,無(wú)論是strong還是weak對(duì)象孕讳,iOS都會(huì)自動(dòng)幫我們處理,屬性被銷(xiāo)毀時(shí)巍膘,weak也會(huì)被自動(dòng)置nil
 */

// 10. @synthesize和@dynamic分別有什么作用厂财?
/** 我的看法:
 *  1> @synthesize就是告訴編譯器,ivar的實(shí)例變量名字峡懈,默認(rèn)是@synthesize var = _var;
 *  2> @dynamic就是告訴編譯器璃饱,setter、getter方法我自己寫(xiě)肪康,不用你自己生成荚恶,如果沒(méi)寫(xiě),則編譯器沒(méi)問(wèn)題磷支,運(yùn)行時(shí)因?yàn)槟銢](méi)寫(xiě)而
       造成崩潰
 */

// 11. @property中NSString(NSArray谒撼、NSDictionary)中的copy有什么作用?如果改為strong會(huì)有什么后果雾狈?
/** 我的看法:
 *  1> 因?yàn)镹SString(NSArray廓潜、NSDictionary)有NSMuttableString(NSMuttableArray、NSMuttableDictionary),使用
       copy為了防止茉帅,在自己不知道的情況下更改了屬性值。
 *  2> 如果采用strong锭弊,則因?yàn)楦割?lèi)指針可以指向子類(lèi)對(duì)象堪澎,則在子類(lèi)對(duì)象不知道的情況下,通過(guò)父類(lèi)指針給改掉了屬性味滞。
 *  3> 在集合類(lèi)(NSArray樱蛤、NSSet、NSDictionary)剑鞍、非集合類(lèi)對(duì)象里(NSString)昨凡,使用copy、muttableCopy之后是:
       非集合類(lèi)采用copy后蚁署,都是指針拷貝
       非集合類(lèi)采用muttableCopy后便脊,都是內(nèi)容拷貝
       集合類(lèi)采用copy后,是指針拷貝
       集合類(lèi)采用muttableCopy后光戈,都是內(nèi)容拷貝(指的是對(duì)象是內(nèi)容拷貝哪痰,集合內(nèi)部的元素仍然是指針拷貝)
 */

// 12. @synthesize的合成實(shí)例變量規(guī)則是什么?如果存在成員屬性foo久妆,并存在一個(gè)_foo實(shí)例變量晌杰,那么還會(huì)自動(dòng)合成新變量嗎?
/** 我的看法:
 *  1> 不會(huì)
 *  2> @synthesize的合成規(guī)則:
 *     一:同時(shí)存在setter筷弦、getter方法
 *     二:存在getter方法
 *     三:使用@dynamic
 *     四:使用@protocol重寫(xiě)了所有的屬性
 *     五:使用@category重寫(xiě)了所有的屬性
 *     六:重載的屬性
 *  3> 實(shí)例變量 = 屬性 = ivar
 *  4> @synthesize: 自動(dòng)合成setter肋演、getter方法,以及自定義ivar名字烂琴,一般建議都使用默認(rèn)ivar
 */

// 13. 給一個(gè)nil對(duì)象發(fā)送消息爹殊,會(huì)發(fā)生什么?
/** 我的看法:
 *  1> 給nil發(fā)送消息监右,在oc當(dāng)中是合法的边灭,并且能通過(guò)運(yùn)行。
 *  2> 給nil發(fā)送消息健盒,如果返回值對(duì)對(duì)象绒瘦,則返回nil,如果是其他定義類(lèi)型扣癣,則返回0惰帽,比如結(jié)構(gòu)體,所有成員值都是0父虑,如果是為定義類(lèi)型该酗,則返回未定義
 *  3> 因?yàn)閛c是運(yùn)行時(shí)語(yǔ)言,如果給對(duì)象發(fā)送消息時(shí),調(diào)用的方法實(shí)際是objc_MsgSend(id, arg)呜魄,它并沒(méi)有返回值悔叽,因此給nil發(fā)送消息,也就是0地址爵嗅,則對(duì)象返回nil娇澎,類(lèi)型返回0,未
       定義返回未定義
 */

// 14. objc中給一個(gè)對(duì)象發(fā)送消息睹晒,和objc_MsgSend()有什么關(guān)系趟庄?
/** 我的看法:
 *  1> objc是一個(gè)運(yùn)行時(shí)語(yǔ)言,當(dāng)給一個(gè)對(duì)象發(fā)送消息時(shí)伪很,最后都會(huì)轉(zhuǎn)化為
       objc_MsgSend()戚啥。
 *  2> 也就是說(shuō),objc中的對(duì)象是oc中的表現(xiàn)形式锉试,而在oc中調(diào)用方法猫十,實(shí)際
       就是給對(duì)象發(fā)送消息,這就是運(yùn)行時(shí)的特性呆盖。
 */

// 15. 什么時(shí)候會(huì)報(bào)unrecognized selector異常炫彩?
/** 我的看法:
 *  1> objc是一個(gè)動(dòng)態(tài)語(yǔ)言,方法的調(diào)用絮短,也就是發(fā)消息江兢,和類(lèi),是在運(yùn)行時(shí)才
       能確定的
 *  2> 當(dāng)給一個(gè)對(duì)象發(fā)送消息時(shí)丁频,大概的調(diào)用過(guò)程是:
 *       一:轉(zhuǎn)化成objc_MsgSend()方法
 *       二:通過(guò)isa找到對(duì)象所屬的類(lèi)
 *       三:然后找到實(shí)例方法或父類(lèi)方法運(yùn)行杉允,找不到就崩潰
 *            但在此之前有幾種拯救方法:
 *              一> 動(dòng)態(tài)添加方法調(diào)用
 *              二> 將消息轉(zhuǎn)發(fā)給其他對(duì)象,讓它調(diào)用方法實(shí)現(xiàn)
 *              三> 通過(guò)修改或刪除函數(shù)簽名席里,讓消息自己消化
 *              四> 產(chǎn)生unrecognized selector(方法未實(shí)現(xiàn)異常)
 *
 */

// 16. 一個(gè)objc對(duì)象如何進(jìn)行內(nèi)存布局叔磷?(考慮有父類(lèi)的情況)
/** 我的看法:
 *  1> 首先,這個(gè)對(duì)象所占用的內(nèi)存中奖磁,存放著父類(lèi)的成員變量以及自己的成員
       變量
 *  2> 然后改基,每個(gè)對(duì)象中都存在一個(gè)isa指針,這個(gè)指針指向它的類(lèi)對(duì)象咖为,而類(lèi)
       對(duì)象中存放著本對(duì)象
 
 *  簡(jiǎn)而言之就是:
 *  一:對(duì)象方法列表(對(duì)象能接收到消息的列表,保存在它對(duì)應(yīng)的類(lèi)對(duì)象中)
 *  二:成員變量列表
 *  三:屬性列表
 *  四:isa指針同上
 */

// 17. 一個(gè)objc對(duì)象的isa指向什么躁染?有什么作用鸣哀?
/** 我的看法:
 *  1> isa指針指向類(lèi)對(duì)象
 *  2> 能夠讓發(fā)送消息得到響應(yīng),也就是確定對(duì)象的類(lèi)
 */

// 18. 下面代碼輸出什么叹放?
/**
 *       @implementation Son : Father
         - (id)init
         {
             self = [super init];
             if (self) {
                NSLog(@"%@", NSStringFromClass([self class]));
                NSLog(@"%@", NSStringFromClass([super class]));
             }
             return self;
             }
         @end
 */
/** 我的看法:
 *  1> self.class super.class 是指對(duì)象的類(lèi)對(duì)象
 *  2> 從代碼看,這里實(shí)例化的只有son尿背,也就是說(shuō),在son對(duì)象里,存在
       class的實(shí)現(xiàn)或重載三痰,即而在調(diào)用self.class方法幕帆,以及
       super.class時(shí)症概,實(shí)際的響應(yīng)是son,因此都輸出son缰泡。
 */

/** 標(biāo)準(zhǔn)答案:
 *  1> class的實(shí)現(xiàn)只有在NSObject里
 *  2> 也就是不管是self干毅,還是super的實(shí)現(xiàn)最終都是NSObject
 *  3> 因此不管是調(diào)用self.class憨奸,還是super.class膀藐,都是NSObject的
       實(shí)現(xiàn)
 *  4> 所以查看源代碼呻率,class的實(shí)現(xiàn)是返回self童谒,也就是實(shí)例對(duì)象
 *  5> 而此刻存在實(shí)例對(duì)象的只有son,因而輸出son
 *  重點(diǎn):
 *  1> 在init方法里面最好不要使用self.xxx,也就是 "點(diǎn)" 語(yǔ)法
 *  2> 因?yàn)樵趇nit里面使用點(diǎn)語(yǔ)法篓吁,有可能會(huì)調(diào)用子類(lèi)的重載方法(在重載后)
 */

// 19. runtime 是如何 通過(guò)@selector 找到 方法的實(shí)現(xiàn)?(包括類(lèi)方法和實(shí)                        例方法)茫因?
/** 我的看法:
 *  1> 不管是類(lèi)對(duì)象還是實(shí)例對(duì)象,其本質(zhì)都是對(duì)象
 *  2> 也就是在對(duì)象里面越除,存在一個(gè)方法列表,把所有的方法名@selector都存在里面
 *  3> 在方法列表里面還存放著方法名外盯、方法實(shí)現(xiàn)摘盆、以及參數(shù)等
 *  4> 所有通過(guò)runtime就能在方法列表里面通過(guò)方法名,找到方法實(shí)現(xiàn)了
 */

// 20. 使用runtime associate關(guān)聯(lián)對(duì)象饱苟,需要在對(duì)象dealloc的時(shí)候釋放嗎孩擂?
/** 我的看法:
 *  1> 無(wú)論是ARC,還是MRC箱熬,都不需要
 */

/** 標(biāo)準(zhǔn)答案:
 *  1> 對(duì)象銷(xiāo)毀的時(shí)間表:
    1. 調(diào)用 -release :引用計(jì)數(shù)變?yōu)榱?    * 對(duì)象正在被銷(xiāo)毀类垦,生命周期即將結(jié)束.
    * 不能再有新的 __weak 弱引用, 否則將指向 nil.
    * 調(diào)用 [self dealloc]
    2. 子類(lèi) 調(diào)用 -dealloc
    * 繼承關(guān)系中最底層的子類(lèi) 在調(diào)用 -dealloc
    * 如果是 MRC 代碼 則會(huì)手動(dòng)釋放實(shí)例變量們(iVars)
    * 繼承關(guān)系中每一層的父類(lèi) 都在調(diào)用 -dealloc
    3. NSObject 調(diào) -dealloc
    * 只做一件事:調(diào)用 Objective-C runtime 中的 object_dispose() 方法
    4. 調(diào)用 object_dispose()
    * 為 C++ 的實(shí)例變量們(iVars)調(diào)用 destructors
    * 為 ARC 狀態(tài)下的 實(shí)例變量們(iVars) 調(diào)用 -release
    * 解除所有使用 runtime Associate方法關(guān)聯(lián)的對(duì)象
    * 解除所有 __weak 引用
    * 調(diào)用 free()
 */

// 21. objc中城须,類(lèi)方法和實(shí)例方法蚤认,有什么本質(zhì)上的區(qū)別和聯(lián)系?
/** 我的看法:
 *  類(lèi)方法
 *  1> 類(lèi)方法只能類(lèi)對(duì)象訪問(wèn)(對(duì)象方法通過(guò)類(lèi)名來(lái)訪問(wèn))
 *  2> 類(lèi)方法是屬于類(lèi)對(duì)象的
 *  3> 類(lèi)方法中self是屬于類(lèi)對(duì)象
 *  4> 類(lèi)方法可以調(diào)用其他的類(lèi)方法
 *  5> 類(lèi)方法不能訪問(wèn)成員變量
 *  6> 類(lèi)方法不能直接調(diào)用成員方法
 
 *  實(shí)例方法:
 *  1> 實(shí)例方法只能通過(guò)實(shí)例方法訪問(wèn)
 *  2> 實(shí)例方法是屬于對(duì)象的
 *  3> 實(shí)例方法中self是屬于實(shí)例對(duì)象
 *  4> 實(shí)例方法可以訪問(wèn)實(shí)例方法
 *  5> 實(shí)例方法可以訪問(wèn)成員變量
 *  6> 實(shí)例方法可以訪問(wèn)類(lèi)方法(通過(guò)類(lèi)名來(lái)訪問(wèn))
 */
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末糕伐,一起剝皮案震驚了整個(gè)濱河市砰琢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌良瞧,老刑警劉巖陪汽,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異褥蚯,居然都是意外死亡挚冤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)赞庶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)训挡,“玉大人澳骤,你說(shuō)我怎么就攤上這事∩岷澹” “怎么了宴凉?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)表悬。 經(jīng)常有香客問(wèn)我弥锄,道長(zhǎng),這世上最難降的妖魔是什么蟆沫? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任籽暇,我火速辦了婚禮,結(jié)果婚禮上饭庞,老公的妹妹穿的比我還像新娘戒悠。我一直安慰自己,他們只是感情好舟山,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布绸狐。 她就那樣靜靜地躺著,像睡著了一般累盗。 火紅的嫁衣襯著肌膚如雪寒矿。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,182評(píng)論 1 299
  • 那天若债,我揣著相機(jī)與錄音符相,去河邊找鬼。 笑死蠢琳,一個(gè)胖子當(dāng)著我的面吹牛啊终,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播傲须,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蓝牲,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了泰讽?” 一聲冷哼從身側(cè)響起搞旭,我...
    開(kāi)封第一講書(shū)人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎菇绵,沒(méi)想到半個(gè)月后肄渗,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咬最,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年翎嫡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片永乌。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惑申,死狀恐怖具伍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情圈驼,我是刑警寧澤人芽,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站绩脆,受9級(jí)特大地震影響萤厅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜靴迫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一惕味、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧玉锌,春花似錦名挥、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至参淫,卻和暖如春救湖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背黄刚。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工捎谨, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留民效,地道東北人憔维。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像畏邢,于是被迫代替她去往敵國(guó)和親业扒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容