iOS 基礎(chǔ)知識拾遺

  1. 設(shè)計模式相關(guān):

設(shè)計模式是一種編碼經(jīng)驗, 就是以比較成熟的邏輯去處理某一類型的事情. 架構(gòu)模式: (1).MVC (2).MVVM (3)MVP (4)VIPER MV(X)系列詳解 英文原文->

iOS中常用設(shè)計模式: (1). 單例模式: 通過static關(guān)鍵字及dispatch_once保證單列在程序運(yùn)行期間只會被初始化一次. (2). KVO: 通過runtime動態(tài)生成一個新的類, 并重寫被觀察對象屬性的setter方法, 來監(jiān)聽對象屬性的改變 (3). 委托模式: protrcol + delegate (4).工廠模式: 通過一個類方法, 批量根據(jù)已有模板生產(chǎn)對象.

  1. #import#incloud的區(qū)別, @class作用?

#import#incloud都是用來導(dǎo)入頭文件. #incloud是C/C++中用來導(dǎo)入頭文件的關(guān)鍵字; #import是Objective-C中用來導(dǎo)入頭文件的關(guān)鍵字, 通過預(yù)編譯指令來防止文件多次導(dǎo)入; @class用來告訴編譯器某個類的聲明, 到運(yùn)行時才去查看類的實(shí)現(xiàn)文件(.m), 可以解決頭文件的相互包含.

  1. framebounds的區(qū)別?

frame是 自身在父view坐標(biāo)系統(tǒng)中的位置和大小, bounds是自身在自己的坐標(biāo)系統(tǒng)中的位置和大小

  1. Objective-C的類可以多重繼承么?Category是什么? Category重寫本類方法后,為什么本類方法不再執(zhí)行, 是被替換了嗎?

Objective-C的類是不可以多繼承的. Category分類, 其中的方法會在運(yùn)行時動態(tài)的添加到本類的method_list中, Category不能添加屬性, 原因是無法在運(yùn)行時本列的ivar_list大小已經(jīng)確定, 無法動態(tài)的去添加_ivar, 可以通過動態(tài)綁定objc_associated來添加屬性. 因為在運(yùn)行時中, 本類的方法會先放入method_list中去, Category中添加的方法, 會進(jìn)行memory_copy放入method_list中, 排在本類方法的前邊, 如果和本類方法重名, 那么在調(diào)用的時候, 找到Category中添加的方法后就會返回調(diào)用. 所以并不是被替換,而是根本就沒有調(diào)用到本類的方法去;

  1. @property的本質(zhì)是什么?

@property本質(zhì)就是_ivar冤议、setter是趴、getter. 屬性的本質(zhì)就是一個帶_的實(shí)例變量 + setter``getter存取方法. 一般們調(diào)用的時候盡量直接調(diào)用_ivar, 這樣的好處是能夠直接對實(shí)例變量進(jìn)行賦值和讀取,不用再經(jīng)過存取方法

  1. @property有什么屬性關(guān)鍵字?都有什么作用?

(1): 原子性關(guān)鍵字:atomic-- 默認(rèn). 原子性, 當(dāng)屬性被atomic修飾時,系統(tǒng)生成的settergetter方法中, 會進(jìn)行加鎖操作, 這樣可以保證數(shù)據(jù)的完整性, 但并不能保證一定是線程安全的. 相較于nonatomic而言, 內(nèi)存消耗更大. nonatomic-- 非默認(rèn). 非原子性, 更快, 若多個線程同時訪問, 則結(jié)果無法預(yù)料.
(2)讀寫權(quán)限: readwrite-- 默認(rèn). 可讀寫, 系統(tǒng)會自動生成settergetter方法 readonly-- 非默認(rèn). 只可讀, 系統(tǒng)只會生成getter方法, 不希望屬性在類外改變
(3)內(nèi)存管理語義: assign:-- 賦值特性, 進(jìn)行簡單的賦值操作 retain(MRC)/strong(ARC): -- 持有特性, setter方法會將傳入的參數(shù)先保留, 再賦值. 傳入?yún)?shù)的retainCount會+1 copy:-- 表示copy特性, setter方法會將傳入?yún)?shù)復(fù)制一份, 常用于NSString, NSArray, NSDictionary等, 不論傳入?yún)?shù)是否是可變對象, 自身持有的那一份保證不可變的屬性. weak-- 表示一種非擁有關(guān)系, weak在屬性所指的對象被銷毀時, 屬性的值會被自動清空 weak底層實(shí)現(xiàn)

  1. 系統(tǒng)對象的copy呻纹、mutableCopy和深拷貝、淺拷貝
  • 非集合類對象的copy孝凌、mutableCopy:
//!< 非集合類不可變對象:
    NSString *str = @"hello word";
    id copyStr = [str copy];
    id mutableCopyStr = [str mutableCopy];
    NSLog(@"str:%p class:%@  \n copyStr:%p class:%@ \n mutableCopyStr:%p  class:%@", str, [str class],  copyStr, [copyStr class], mutableCopyStr, [mutableCopyStr class]);
    
    //!< 非集合類可變對象:
    
    NSMutableString *str1 = [[NSMutableString alloc] initWithFormat:@"hello word"];
    id copyStr1 = [str1 copy];
    id mutableCopyStr1 = [str1 mutableCopy];
    NSLog(@"str1:%p class:%@  \n copyStr1:%p class:%@ \n mutableCopyStr1:%p  class:%@", str1, [str1 class],  copyStr1, [copyStr1 class], mutableCopyStr1, [mutableCopyStr1 class]);
  • 結(jié)果:
2019-04-23 16:57:57.185947+0800 JSOCInteraction[17107:6685981] str:0x102ef43b8 class:__NSCFConstantString  
 copyStr:0x102ef43b8 class:__NSCFConstantString 
 mutableCopyStr:0x6000001d2ac0  class:__NSCFString
2019-04-23 16:57:57.186221+0800 JSOCInteraction[17107:6685981] str1:0x6000001cbf00 class:__NSCFString  
 copyStr1:0x600000fc5660 class:__NSCFString 
 mutableCopyStr1:0x6000001cbdb0  class:__NSCFString

由上述代碼可以看出, 對非集合類不可變對象進(jìn)行copy淺拷貝, 只復(fù)制了對象的指針, 而mutableCopy深拷貝, 拷貝出了一份新的可變對象和一份指針; 對非集合類可變對象進(jìn)行copymutableCopy都是深拷貝

  • 集合類對象的copymutableCopy:
NSArray *arr = @[];
    id copyArr = [arr copy];
    id mutableCArr = [arr mutableCopy];
    NSLog(@"arr:%p class:%@     \n  \tcopyArr:%p class:%@ \n \tmutableCArr:%p  class:%@", arr, [arr class],  copyArr, [copyArr class], mutableCArr, [mutableCArr class]);
    
    
    NSMutableArray *muArr = [NSMutableArray new];
    id copyMuArr = [muArr copy];
    id mutableCMuArr = [muArr mutableCopy];
    
    NSLog(@"muArr:%p class:%@     \n \tcopyMuArr:%p class:%@ \n \tmutableCMuArr:%p  class:%@", muArr, [muArr class],  copyMuArr, [copyMuArr class], mutableCMuArr, [mutableCMuArr class]);
  • 結(jié)果:
2019-04-23 16:57:57.186472+0800 JSOCInteraction[17107:6685981] arr:0x600000d88030 class:__NSArray0     
    copyArr:0x600000d88030 class:__NSArray0 
    mutableCArr:0x6000001cbf00  class:__NSArrayM
2019-04-23 16:57:57.187073+0800 JSOCInteraction[17107:6685981] muArr:0x6000001cbdb0 class:__NSArrayM     
    copyMuArr:0x600000d88030 class:__NSArray0 
    mutableCMuArr:0x6000001cbc00  class:__NSArrayM

由結(jié)果可見: 對不可變的集合類對象(NSArray, NSDictionary等)進(jìn)行copy淺拷貝; 進(jìn)行mutableCopy深拷貝; 不過只是單層深拷貝, 即只對對象本身進(jìn)行深拷貝, 集合中的元素還是指針拷貝; 對可變集合類對象進(jìn)行copymutableCopy都是進(jìn)行了單層深拷貝.

  1. 如何讓自己的類用 copy 修飾符?
@interface WKCopyObject ()<NSCopying, NSMutableCopying>

@property (nonatomic, copy) NSString *name;

@end
- (id)copyWithZone:(NSZone *)zone {
    WKCopyObject *obj = [[[self class] alloc] init];
    obj.name = self.name;
    return obj;
}

- (id)mutableCopyWithZone:(NSZone *)zone {
    WKCopyObject *obj = [[[self class] alloc] init];
    obj.name = self.name.mutableCopy;
    return obj;
}
  1. autoreleasepool的實(shí)現(xiàn)原理與釋放時機(jī)?

我們使用clang指令對main.m進(jìn)行rewrite, 得到main.cpp文件:clang -rewrite-objc main.m, 可以看到有關(guān)autoreleasepool的關(guān)鍵代碼:

extern "C" __declspec(dllimport) void * objc_autoreleasePoolPush(void);
extern "C" __declspec(dllimport) void objc_autoreleasePoolPop(void *);

struct __AtAutoreleasePool {
  __AtAutoreleasePool() {atautoreleasepoolobj = objc_autoreleasePoolPush();}
  ~__AtAutoreleasePool() {objc_autoreleasePoolPop(atautoreleasepoolobj);}
  void * atautoreleasepoolobj;
};

可以看到autoreleasepool是一個由objc_autoreleasePoolPush()objc_autoreleasePoolPop()和一個atautoreleasepoolobj組成的結(jié)構(gòu)體蘋果開源代碼

  1. viewController的生命周期?

(1)- initWithNibName:bundle:(通過.nib創(chuàng)建/init創(chuàng)建時調(diào)用, init創(chuàng)建時, 也是調(diào)用- initWithNibName:bundle:, 只不過參數(shù)全部傳入nil); (1-1)- initWithCoder:(storyboard創(chuàng)建時, 那個 storyboard 會在自己內(nèi)部生成一個nib, 將nib放入一個coder中); (2)- awakeFromNib:; (3)- loadView:當(dāng)需要用到view的時候,但是view還沒有初始化時會調(diào)用; (4)- viewDidLoad:view已經(jīng)加載完畢; (5)- viewWillAppearview即將顯示; (6)- updateViewConstrains: 更新view的約束; (7)- viewWillLayoutSubviews; (8)- viewDidLayoutSubviews:; (9)- viewDidAppear:視圖已經(jīng)完全展示; (10)- viewWillDisappear: 視圖即將消失; (11)- viewDidDisappear: 視圖已經(jīng)完全消失; (12)dealloc.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蔫慧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌权薯,老刑警劉巖姑躲,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異盟蚣,居然都是意外死亡黍析,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門屎开,熙熙樓的掌柜王于貴愁眉苦臉地迎上來阐枣,“玉大人,你說我怎么就攤上這事∥攴保” “怎么了虑粥?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長宪哩。 經(jīng)常有香客問我娩贷,道長,這世上最難降的妖魔是什么锁孟? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任彬祖,我火速辦了婚禮,結(jié)果婚禮上品抽,老公的妹妹穿的比我還像新娘储笑。我一直安慰自己,他們只是感情好圆恤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布突倍。 她就那樣靜靜地躺著,像睡著了一般盆昙。 火紅的嫁衣襯著肌膚如雪羽历。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天淡喜,我揣著相機(jī)與錄音秕磷,去河邊找鬼。 笑死炼团,一個胖子當(dāng)著我的面吹牛澎嚣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瘟芝,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼易桃,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了模狭?” 一聲冷哼從身側(cè)響起颈抚,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤踩衩,失蹤者是張志新(化名)和其女友劉穎嚼鹉,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驱富,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锚赤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了褐鸥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片线脚。...
    茶點(diǎn)故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出浑侥,到底是詐尸還是另有隱情姊舵,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布寓落,位于F島的核電站括丁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏伶选。R本人自食惡果不足惜史飞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望仰税。 院中可真熱鬧构资,春花似錦、人聲如沸陨簇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽河绽。三九已至拦赠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間葵姥,已是汗流浹背荷鼠。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留榔幸,地道東北人允乐。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像削咆,于是被迫代替她去往敵國和親牍疏。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評論 2 354