為什么在主線程更新UI?
主要原因還是為了線程的安全,但是UIkit的線程不是安全的,假如在兩個線程中設(shè)置同一張背景圖片的話灼卢,這個圖片當被釋放的時候就會被釋放兩次,當前這個線程設(shè)置圖片地址會把上一個線程賦值的圖片地址給覆蓋来农,因為他們設(shè)置的是同一個地址鞋真,這樣就會出現(xiàn)野指針錯誤,會發(fā)生程序崩潰沃于。雖然apple對大部分的繪圖方法改成線程安全可用涩咖,但是官方還是建議我們在主線程進行UI更新,這樣就會保證線程安全繁莹。
分別描述類別(categories)和延展(extensions)是什么抠藕?以及兩者的區(qū)別?繼承和類別在實現(xiàn)中有何區(qū)別蒋困?為什么Category只能為對象添加方法,卻不能添加成員變量敬辣?
類別:在沒有原類.m文件的基礎(chǔ)上雪标,給該類添加方法;
延展:一種特殊形式的類別溉跃,主要在一個類的.m文件里聲明和實現(xiàn)村刨。延展的作用就是給某個類添加私有方法和私有變量。
兩個的區(qū)別:
? ? * 延展可以添加屬性并且它添加的方法是必須要實現(xiàn)的撰茎。延展可以認為是一個私有的類目嵌牺。
? ? * 類別可以在不知道不改變原來代碼的情況下往里面添加新的方法,只能添加不能修改和刪除。
? ? * 并且如果類別和原來類中的方法產(chǎn)生名稱沖突逆粹,則類別將覆蓋原來的方法募疮,因為類別具有更高的優(yōu)先級。
? ? * 繼承可以增加僻弹,修改刪除方法阿浓,添加屬性。
Category只能為對象添加方法蹋绽,卻不能添加成員變量的原因:如果可以添加成員變量芭毙,添加的成員變量沒有辦法初始化。
nil卸耘、Nil退敦、NULL和NSNull區(qū)別
NULL是宏,是對于C語言指針而使用的蚣抗,表示空指針
nil是宏侈百,是對于Objective-C中的對象而使用的,表示對象為空
Nil是宏忠聚,是對于Objective-C中的類而使用的设哗,表示類指向空
NSNull是類類型,是用于表示空的占位對象
什么情況使用weak關(guān)鍵字两蟀,相比assign有什么不同网梢?
在ARC中,在有可能出現(xiàn)循環(huán)引用的時候赂毯,往往要通過讓其中一端使用weak來解決战虏,如delegate屬性。自身已經(jīng)對它進行一次強引用党涕,沒有必要再強引用一次烦感,此時也會用weak,自定義IBOutlet控件屬性一般也使用weak
weak此特質(zhì)表明該屬性定義了一種“非擁有關(guān)系”膛堤。為這種屬性設(shè)置新值時手趣,設(shè)置方法既不保留新值,也不釋放舊值肥荔。此特質(zhì)同assign類似绿渣,然而在屬性所指的對象遭到摧毀時,屬性值也會清空燕耿。而assign的“設(shè)置方法”只會執(zhí)行針對“純量類型”的簡單賦值操作中符。assign可以用非OC對象,而weak必須用于OC對象
一個NSObject對象占用多少內(nèi)存誉帅?
一個指針變量所占用的大械砩ⅰ(64bit占8個字節(jié)右莱,32bit占4個字節(jié))。
對象的isa指針指向哪里档插?
instance對象的isa指針指向class對象慢蜓,class對象的isa指針指向meta-class對象,meta-class的isa指針指向基類的meta-class對象阀捅,基類自己的isa指針也指向自己胀瞪。
OC的類信息存放在哪里?
成員變量的具體值存放在instance對象饲鄙。對象方法凄诞,協(xié)議,屬性忍级,成員變量信息存放在class對象帆谍。類方法信息存放在meta-class對象。
Push Notification是如何工作的
推送通知分為兩種轴咱,一個是本地推送汛蝙,一個是遠程推送
本地推送:不需要聯(lián)網(wǎng)也可以推送,是開發(fā)人員在APP內(nèi)設(shè)定特定的時間來提醒用戶干什么
遠程推送:需要聯(lián)網(wǎng)朴肺,用戶的設(shè)備會與蘋果服務(wù)器形成一個長鏈接窖剑,用戶設(shè)備會發(fā)送uuid和Bundle identifier給蘋果服務(wù)器,蘋果服務(wù)器會加密生成一個deviceToken給用戶設(shè)備戈稿,然后設(shè)備會將deviceToken發(fā)送給APP的服務(wù)器西土,服務(wù)器會將deviceToken存進他們的數(shù)據(jù)庫,這時候如果有人發(fā)送消息給我鞍盗,服務(wù)器端就會去查詢我的deviceToken需了,然后將deviceToken和要發(fā)送的信息發(fā)送給蘋果服務(wù)器,蘋果服務(wù)器通過deviceToken找到我的設(shè)備并將消息推送到我的設(shè)備上般甲。這里還有個情況是如果APP在線肋乍,那么APP服務(wù)器會與APP產(chǎn)生一個長鏈接,這時候APP服務(wù)器會直接通過deviceToken將消息推送到設(shè)備上敷存。
控制器View的生命周期
loadView: 加載view
viewDidLoad:? ? ? ? ? ? ? ? ? view加載完畢
viewWillAppear:? ? ? ? ? ? ? 控制器的view將要顯示
viewWillLayoutSubviews: 控制器的view將要布局子控件
viewDidLayoutSubviews: 控制器的view布局子控件完成
viewDidAppear:? ? ? ? ? ? ? ? 控制器的view完全顯示
viewWillDisappear:? ? ? ? 控制器的view即將消失的時候
viewDidDisappear:? ? ? ? 控制器的view完全消失的時候