iOS知識合集

一、多線程開發的理解以及iOS中有幾種實現多線程的方法?

好處:

1、使用線程可以把程序中占據時間長的任務放到后臺去處理,如圖片、視頻的下載;

2、發揮多核處理器的優勢,并發執行讓系統運行的更快、更流暢,用戶體驗更好。

缺點:

1、大量的線程降低代碼的可讀性;

2、更多的線程需要更多的內存空間;

3、當多個線程對同一個資源出現爭奪的時候要注意線程安全的問題。

iOS有三種多線程編程的技術:

1、NSThread(兩種創建方式)[NSThread detachNewThreadSelector:@selector(doSomething:) toTarget:self withObject:nil];NSThread *myThread = [[NSThread alloc] initWithTarget:self selector:@selector(doSomething:) object:nil];

[myThread start];

2、NSOperationQueue

NSOperationQueue *oprationQueue = [[NSOperationQueue alloc] init];

oprationQueue addOperationWithBlock:^{

//這個block語句塊在子線程中執行

}

3、Grand Central Dispatch (GCD)

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

// 耗時的操作

dispatch_async(dispatch_get_main_queue(), ^{

    // 更新界面

});

});

不顯示的創建線程的方法:用NSObject的類方法 performSelectorInBackground:withObject: 創建一個線程:[Obj performSelectorInBackground:@selector(doSomething) withObject:nil];

二、線程同步和異步的區別?IOS中如何實現多線程的同步?

同步:一個線程要等待上一個線程執行完之后才能執行當前的線程。

異步:同時去做兩件或者多件事。比如邊聽歌邊看報。

實現:原子操作(atomic)、加鎖(NSLock、NSRecursive、NSConditionLock)、@synchronized GCD串行隊列,GCD當中的屏障,NSOperationQueue設置最大并發數為1

三、iOS本地數據存儲都有哪幾種方式?iOS如何實現復雜對象的存儲?

NSKeyedArchiver(歸檔)采用歸檔的形式來保存數據,該數據對象需要遵守NSCoding協議,并且該對象對應的類必須提供encodeWithCoder:和initWithCoder:方法。

1.NSUserDefaults:用來保存應用程序設置和屬性、用戶保存的數據。用戶再次打開程序或開機后這些數據仍然存在。NSUserDefaults可以存儲的數據類型包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。

2.Write寫入方式:永久保存在磁盤中。

3.SQLite(FMDB、CoreData)

NSCoding + NSKeyedArchiver實現復雜對象的存儲。

四、怎樣實現一個singleton的類?

//第一種方式

static LOSingleton * shareInstance;

+( LOSingleton *)sharedInstance{

@synchronized(self){//這個東西其實就是一個加鎖。如果self 其他線程訪問,則會阻塞。這樣做一般是用來對單例進行一個死鎖的保護

    if (shareInstance == nil) {

        shareInstance = [[super allocWithZone:NULL] init];

    }

}

return shareInstance;

}

//第二種方式

  • (LOSingleton *) sharedInstance

{

static  LOSingleton *sharedInstance = nil ;

static  dispatch_once_t onceToken;  // 鎖

dispatch_once (& onceToken, ^ {     // 最多調用一次

    sharedInstance = [[self  alloc] init];

});

return  sharedInstance;

}

五、什么是安全釋放?

在對象release之后把指針置為nil。

六、簡述你對UIView、UIWindow和CALayer的理解

UIView繼承于UIResponder, UIResponder繼承于NSObject,UIView可以響應用戶事件。CALayer繼承于NSObject,所以CALayer不能響應事件。UIView構建界面,UIView側重于對內容的管理,CALayer側重于對內容的繪制。UIView是用來顯示內容的,可以處理用戶事件;CALayer是用來繪制內容的,對內容進行動畫處理,依賴與UIView來進行顯示,不能處理用戶事件。

七、什么是Protocol?什么是代理?寫一個委托的interface?委托的property聲明用什么屬性?為什么?

協議提供了一組方法,但是并不負責實現,如果一個類遵循了某個協議,并且實現了協議里面的方法,那么我們稱這個類就是遵循了某個協議的代理。屬性的聲明使用assign,防止出現循環引用的問題。

八、分別描述類別(categories)和延展(extensions)是什么?以及兩者的區別?繼承和類別在實現中有何區別?為什么Category只能為對象添加方法,卻不能添加成員變量?

category類目:在不知道源碼的情況下為一個類擴展方法;

extension:為一個類聲明私有方法和變量。繼承是創建了一個新的類,而類別只是對類的一個擴展,還是之前的類。類目的作用就是為已知的類添加方法。

九、Objective-C有私有方法么?私有變量呢?如多沒有的話,有沒有什么代替的方法?

objective-c – 類里面的方法只有兩種, 靜態方法和實例方法.

@private來修飾私有變量

OC中所有的實例變量默認都是私有的,所有的實例方法默認都是公有的。

十、objc中的減號與加號代表什么?

+靜態方法,也叫類方法,-實例方法

十一、對于語句NSString* testObject = [[NSData alloc] init];testObject 在編譯時和運行時分別是什么類型的對象?

編譯的時候是NSString類型,運行的時候是NSData類型

十二、OC中是所有對象間的交互是如何實現的?

函數指針實現

十三、#import和#include的區別是什么?#import<> 跟 #import""有什么區別?

1、#import能避免頭文件被重復包含的問題

2、一般來說,導入objective c的頭文件時用#import,包含C/C++頭文件時用#include。

3、#import 確定一個文件只能被導入一次,這使你在遞歸包含中不會出現問題。

4、#import<> 包含iOS框架類庫里的類,#import""包含項目里自定義的類。

5、#import比起#include的好處就是它避免了重復引用的問題。所以在OC中我們基本用的都是import。

十四、Category是什么?擴展一個類的方式用繼承好還是類目好?為什么?

Category是類目。用類目好,因為繼承要滿足a is a b的關系,而類目只需要滿足a has a b的關系,局限性更小,你不用定義子類就能擴展一個類的功能,還能將類的定義分開放在不同的源文件里, 用Category去重寫類的方法,僅對本Category有效,不會影響到其他類與原有類的關系。

十五、類實例(成員)變量的@protected,@private,@public聲明各有什么含義?

@protected:受保護的,該實例變量只能在該類和其子類內訪問,其他類內不能訪問。

@private:私有的,該實例變量只能在該類內訪問,其他類內不能訪問。

@public:共有的,該實例變量誰都可以訪問。

十六、id聲明的對象有什么特性?

1、沒有 * 號

2、動態數據類型

3、可以指向任何類的對象(設置是nil),而不關心其具體類型

4、在運行時檢查其具體類型

5、可以對其發送任何(存在的)消息

十七、內存管理的幾條原則是什么?按照默認法則,哪些關鍵字生成的對象需要手動釋放?哪些情況下不需要手動釋放,會直接進入自動釋放池?

內存管理的原則是:誰創建,誰釋放;誰引用,誰管理。

遵循Cocoa Touch的使用原則;

內存管理主要要避免“過早釋放”和“內存泄漏”,對于“過早釋放”需要注意@property設置特性時,一定要用對特性關鍵字,對于“內存泄漏”,一定要申請了要負責釋放,要細心。

1、當使用new、alloc或copy方法創建一個對象時,該對象引用計數器為1。如果不需要使用該對象,可以向其發送release或autorelease消息,在其使用完畢時被銷毀。

2、如果通過其他方法獲取一個對象,則可以假設這個對象引用計數為1,并且被設置為autorelease,不需要對該對象進行清理,如果確實需要retain這個對象,則需要使用完畢后release。

3、如果retain了某個對象,需要release或autorelease該對象,保持retain方法和release方法使用次數相等。

4、使用new、alloc、copy關鍵字生成的對象和retain了的對象需要手動釋放。設置為autorelease的對象不需要手動釋放,會直接進入自動釋放池。

十八、屬性readwrite,readonly,assign,retain,copy,nonatomic 各是什么作用,在那種情況下用?

assign用于簡單數據類型,如NSInteger,double,bool;

retain和copy用于對象;

readwrite是可讀可寫特性;需要生成getter方法和setter方法時;

readonly是只讀特性 只會生成getter方法 不會生成setter方法 ,不希望屬性在類外改變;

assign是賦值特性,setter方法將傳入參數賦值給實例變量;僅設置變量時;

retain表示持有特性,setter方法將傳入參數先保留,再賦值,傳入參數的retaincount會+1;

copy表示賦值特性,setter方法將傳入對象復制一份;需要完全一份新的變量時;

nonatomic非原子操作,決定編譯器生成的setter getter是否是原子操作,atomic表示多線程安全,一般使用nonatomic。

十九、Objective-C如何對內存管理的,說說你的看法和解決方法?

Objective-C的內存管理主要有三種方式ARC(自動內存計數)、手動內存計數、內存池。

二十、那些關鍵字生成的對象 需要手動釋放?

關鍵字alloc 或new 生成的對象需要手動釋放

二十一、如何對iOS設備進行性能測試?

Profile-> Instruments ->Time Profiler

二十二、Category是什么?重寫一個類的方式用繼承好還是分類好?為什么?

Category是類別,一般情況用分類好,用Category去重寫類的方法,僅對本Category有效,不會影響到其他類與原有類的關系。

二十三、Object C中創建線程的方法是什么?如果在主線程中執行代碼,方法是什么?如果想延時執行代碼、方法又是什么?

線程創建有三種方法:使用NSThread創建、使用 GCD的dispatch、使用子類化的NSOperation,然后將其加入NSOperationQueue;在主線程執行代碼,方法是 performSelectorOnMainThread,如果想延時執行代碼可以用performSelector:onThread:withObject:waitUntilDone

二十四、什么是Notification?什么時候用delegate,什么時候用Notification?

觀察者模式,controller向defaultNotificationCenter添加自己的notification,其他類注冊這個notification就可以收到通知,這些類可以在收到通知時做自己的操作(多觀察者默認隨機順序發通知給觀察者們,而且每個觀察者都要等當前的某個觀察者的操作做完才能輪到他來操作,可以用NotificationQueue的方式安排觀察者的反應順序,也可以在添加觀察者中設定反映時間,取消觀察需要在viewDidUnload 跟dealloc中都要注銷)。

delegate針對one-to-one關系,并且reciever可以返回值給sender,notification 可以針對one-to-one/many/none,reciever無法返回值給sender.所以,delegate用于sender希望接受到reciever的某個功能反饋值,notification用于通知多個object某個事件。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,836評論 6 540
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,275評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,904評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,633評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,368評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,736評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,740評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,919評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,481評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,235評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,427評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,968評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,656評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,055評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,348評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,160評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,380評論 2 379

推薦閱讀更多精彩內容

  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,197評論 30 471
  • 37.cocoa內存管理規則 1)當你使用new,alloc或copy方法創建一個對象時,該對象的保留計數器值為1...
    如風家的秘密閱讀 880評論 0 4
  • 1.項目經驗 2.基礎問題 3.指南認識 4.解決思路 ios開發三大塊: 1.Oc基礎 2.CocoaTouch...
    陽光的大男孩兒閱讀 5,015評論 0 13
  • 轉:http://www.cocoachina.com/programmer/20151019/13746.htm...
    Style_偉閱讀 1,329評論 0 3
  • 小的時候,躺在房頂上和月亮說話,叫它月亮姐姐。會蹲在山間,和會蟲子說話。晚上睡覺時,會打開想象力,編故事,編著編著...
    LOVE玲媛閱讀 258評論 0 1