1.Object-C 是如何實現內存管理的? 經常使用的內存管理語句有哪些?html
Object-C 中的內存管理也就是引用計數機制。
手動引用計數(MRC),當建立一個對象的時候系統會爲這個對象的引用計數置爲1,retain方法會使對象的引用計數加1,release方法會使對象的的引用計數減1,當引用計數爲0時, 調用dealloc方法去銷燬對象。ios
自動引用計數(ARC),自動引用計數的實質仍是經過引用計數機制去管理的,只不夠不用咱們程序員去手動管理,系統會在程序編譯時自動在合適的地方添加retain、release、autorelease 方法去控制引用計數的平衡。
內存管理的經常使用語句有 alloc 、retain 、release 、dealloc 、autorelease 。程序員
順便提一下 內存管理嚴格遵循四條規則?
一、由本身生成的對象,本身持有
二、非本身生成的對象,本身也能持有
三、再也不須要本身持有的對象時釋放
四、非本身持有的對象沒法釋放面試
2.淺拷貝和深拷貝的區別? 寫一段深拷貝的代碼。sql
淺拷貝就是對內存地址的複製,讓目標對象指針和源對象指向同一片內存空間.設計模式
深拷貝就是指拷貝對象的具體內容,而內存地址是自主分配的,拷貝結束以後,兩個對象雖然存的值是相同的,可是內存地址不同,兩個對象也互不影響,互不干涉。性能優化
void testMutable() { //可變對象的複製,copy和mutableCopy都是深拷貝 NSMutableString *str1 = [NSMutableString stringWithString:@"test"]; NSMutableString *str2 = [str1 copy]; //copy返回的是不可變對象,所以str2不能改變,會發生崩潰 //[str2 appendString:@"test"]; NSMutableString *str3 = [str1 mutableCopy]; [str3 appendString:@"test"]; NSLog(@"%@ %@ %@",str1,str2,str3); NSLog(@"%p %p %p",str1,str2,str3); }
3.下面一點錯誤百出的程序,指出它有什麼問題。網絡
typedef void(^MyBlock)(NSString *str); @interface ViewController @property(weak) MyBlock block; @property(nonatomic,strong) NSString *currentText; @end --------------------------- @implementation ViewController -(void)method{ NSString *text =@"123"; self.block = ^(NSString *str){ self.currentText = str; text = str; }; } @end ---------更正的代碼以下-------- typedef void(^MyBlock)(NSString *str); @interface ViewController:NSObject @property(copy) MyBlock block; @property(nonatomic,copy) NSString *currentText; @end --------------------------- @implementation ViewController -(void)method{ __block NSString *text =@"123"; __weak typeof(self) weakSelf = self; self.block = ^(NSString *str){ weakSelf.currentText = str; text = str; }; } @end
4.從名爲 'employee' 的 sqlite 表中查找 'name' 屬性以 'Jo' 開頭的從符合結構的第100條開始10條記錄,按 'updatedAt' 倒序。多線程
這個先不寫了,我要好好看一下在貼出來。 哈哈哈
5.iOS 中經常使用的設計模式有哪些? Notification 和 Delegate 使用區別。併發
MVC 、MVVM 、代理 、block 、KVC 、KVO 。
Notification 和 Delegate 均可以用來傳遞消息。
Delegate 是一對一的,兩者要創建相互關聯。
Notification 是一對一 或 一對多的,兩者不須要作相互關聯。
Delegate 的效率要比 Notification 高。
6.tableView 的DateSource 協議有哪些方法必需要實現,怎麼進行性能優化?
(1)numberOfSectionsInTableView: //可寫可不寫(當一個分區的時可不寫) (2)tableView:numberOfRowsInSecion: (3)tableView:cellForRowAtIndexPath: 優化問題: (1):網絡請求成功後進入後臺進行佈局計算並返回高度緩衝備用。 (2):當cell的subview較多時尤爲是圖片的時候建議用其drawRect:中自行繪製。 (3):透明的問題,將UI元素的透明度設置成不透明的。
7.iOS 中的多線程實現有哪些,對你瞭解最深刻的說說你的理解。
一、NSThread
二、NSOperation
三、Grand Central Dispatch (GCD)
一、使用線程能夠把程序中佔據時間長的任務放到後臺去處理,如圖片、視頻的下載。 二、發揮多核處理器的優點,併發執行讓系統運行的更快、更流暢,用戶體驗更好。 三、能適當提升執行效率,提升資源利用率。 四、建立線程是有開銷的,大量開啓的話,會下降性能;程序設計也會更復雜,好比線程之間的通訊,多線程的數據共享。 5.GCD會自動管理線程的生命週期(建立線程,調度任務,銷燬線程),不須要咱們編寫任何管理線程的代碼。 6.http://blog.sina.com.cn/s/blog_99c943d00102wphm.html