// 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))
*/
回顧一下OC基礎(chǔ)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門(mén)赞庶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)训挡,“玉大人澳骤,你說(shuō)我怎么就攤上這事∩岷澹” “怎么了宴凉?”我有些...
- 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)表悬。 經(jīng)常有香客問(wèn)我弥锄,道長(zhǎng),這世上最難降的妖魔是什么蟆沫? 我笑而不...
- 正文 為了忘掉前任籽暇,我火速辦了婚禮,結(jié)果婚禮上饭庞,老公的妹妹穿的比我還像新娘戒悠。我一直安慰自己,他們只是感情好舟山,可當(dāng)我...
- 文/花漫 我一把揭開(kāi)白布绸狐。 她就那樣靜靜地躺著,像睡著了一般累盗。 火紅的嫁衣襯著肌膚如雪寒矿。 梳的紋絲不亂的頭發(fā)上,一...
- 那天若债,我揣著相機(jī)與錄音符相,去河邊找鬼。 笑死蠢琳,一個(gè)胖子當(dāng)著我的面吹牛啊终,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播傲须,決...
- 文/蒼蘭香墨 我猛地睜開(kāi)眼蓝牲,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了泰讽?” 一聲冷哼從身側(cè)響起搞旭,我...
- 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎菇绵,沒(méi)想到半個(gè)月后肄渗,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡咬最,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年翎嫡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片永乌。...
- 正文 年R本政府宣布,位于F島的核電站绩脆,受9級(jí)特大地震影響萤厅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜靴迫,卻給世界環(huán)境...
- 文/蒙蒙 一惕味、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧玉锌,春花似錦名挥、人聲如沸。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至参淫,卻和暖如春救湖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背黄刚。 一陣腳步聲響...
- 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像畏邢,于是被迫代替她去往敵國(guó)和親业扒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- oc基礎(chǔ)知識(shí)回顧 1.import的作用 2.OC中的數(shù)據(jù)類(lèi)型 3.NSArray和NSMutableArray不...
- 第一次咆贬,感到自己不聲不響的不去上班是不是做錯(cuò)了败徊? 已經(jīng)過(guò)去了一天,有點(diǎn)失落掏缎,是不是真的做錯(cuò)了皱蹦?被奶奶說(shuō)了煤杀,她很不懂...
- 第134章:錢(qián)玲玲 錢(qián)小錢(qián)回到錢(qián)家老院子。 錢(qián)進(jìn)胡麗秀去地里翻土了沪哺,中午收活回來(lái)發(fā)現(xiàn)桌上擺放著熱騰騰的飯菜沈自。 “爺...