關于iOS的一些面試題

(id)數據類型:1、對象不需要*號
2、可以發送任何存在的消息
3、不能用.屬性
4、可以指向任何類的對象,而不關心其具體的類型

KVC和KVO
kVC 鍵值編碼 通過把屬性名當成key 來改變屬性的值
KVO 鍵值觀察者 通過KVC的方式 把屬性當做key 來觀察屬性值的變化 做出響應 需移除觀察者

單例 (一個類的對象只能被使用一次)
通過方法 讓對象只創建一次 可以避免重復創建 節省內存開支
使用環境:不需要重復創建的操作類中 封裝數據庫 網絡請求 某個固定的對象 不希望在使用的時候 被創建成其他的對象(當前用戶)
單例的生命周期(從程序開始到程序結束)

寫一個單例

//單例
static User *user = nil;

@implementation User

+(id)defaultManager{
    @synchronized (self) {
        if (user == nil) {
            user = [[User alloc]init];
        }
    }
    return user;
}

+(instancetype)allocWithZone:(struct _NSZone *)zone{
    if (user == nil) {
        user = [[User alloc]init];
    }
    return user;
}
static HTTP_Manager_Delegate *manager=nil;

//在多線程中的一個只能有一次的標識符
static dispatch_once_t onceToken;

//多線程中 查看是否有一個帶有onceToken標識的對象
dispatch_once(&onceToken, ^{
    //如果沒有 創建
    manager = [[HTTP_Manager_Delegate alloc]init];
});
//如果有 就return
return manager;

@class
僅僅是聲明一個類名,并不會包含類的完整聲明
能解決循環包含的問題:當兩個類文件有循環依賴關系 ( A 引用 B , B 引用 A ) 時,需要用 @class

import 和 #include

import 是 Objective-C 導入頭文件的關鍵字,完整地包含某個文件的內容

會自動導入一次,不會重復導入;
不會引發交叉編譯;

include

C/C++ 導入頭文件的關鍵字,完整地包含某個文件的內容
會引發交叉編譯, 因為在 Objective-C 中會存在C/C++和Objective-C 混編的問題,如果用 #include 引入頭文件,會導致交叉編譯

import<> 和 import""
<> : 引用系統文件,它用于對系統自帶的頭文件的引用,編譯器會在系統文件目錄下去查找該文件.

"": 用戶自定義的文件用雙引號引用,編譯器首先會在用戶目錄下查找,然后到安裝目錄中查

網絡請求:首先需要一個接口,還需要request(設置緩存方式,請求時間),需要連接服務器,請求數據,解析;

AFN
全稱是AFNetworking,是對NSURLConnection的一層封裝
它運行效率沒有ASI高,但是使用比ASI簡單
它 實現推送,要一個接口,封裝參數(字典)、manager 設置請求格式 ,還可以post/get請求

get/post區別
get:url與參數封裝到一起,有長度限制,安全系數低
post:url與參數分開,長度不受限,安全系數高

block作用:
1、保存代碼。一段代碼在合適的時間執行(請求成功時彈出一個提示框)。
2、block一般用來兩個的類的數據逆傳遞(修改昵稱的時候)
3、block也可以將一個操作當做參數來傳遞
做回調函數,可替代代理;
注:如果要在代碼塊里修改外部的局部變量的時候,要用__block或者__weak修飾,不然會崩潰。

循環引用:
strong weak

delegate 可以用assign、weak
用weak,避免野指針(一個對象釋放了,但內存沒有釋放掉)

UITableView的重用機制?.

tableView 出現界面卡死,或者上下滑動出現卡頓現象的原因?
1、沒有使用重用機制;
2、滑動cell時,有耗時操作,阻塞主線程(只能用來更新UI)

多線程:用來處理耗時操作,增加用戶體驗
多線程包括?
NSThread:開辟線程,需要手動管理
NSOperation:需要有線程隊列,可以添加依賴關系,(如果不放在線程中,它不一定在子線程中)
GCD:NSOperation是基于GCD的封裝
1》為多核的并行運算提出了解決方案
2》GCD會利用更多的CPU內核,比如雙核,四核
3》GCD自動管理線程的生命周期(創建線程,調度任務,銷毀線程)
4》程序員只需要告訴GCD想要執行什么任務,不需要編寫任何線程管理代碼

  • 1、創建視圖
  • 2、創建一個串行隊列
  • 3、用異步方式執行串行隊列中的任務
  • 4、加載網絡資源
  • 5、回到主線程
  • 6、更新UI
    執行隊列的四種方式:
    串行同步
    串行異步
    并行同步
    并行異步

數據持久化

常用的數據持久化方式有: 屬性列表(plist文件)、歸檔(存儲自定義的類的對象時;存儲用戶的數據(昵稱,uid))、偏好設置(NSUserDefault(存儲一些簡單的數據(用戶的設置)))、sqlite3、core data、FMDB(大量數據的時候) create table student IF NOT EXISTS (id
integer, name text, age text)

當有少量基礎數據類型的數據和NSArray、NSDictionary需要儲存并且無需加密時,就以使用plist文件

儲存少量的數據,而且需要加密,比如登陸密碼、獲取的accessToken時,或者需要儲存對象,比如做收藏夾、最近訪問,都可以使用鍵值歸檔

偏好設置的話就是儲存一些用戶設置信息,比如程序中設置當中的一些開關的Bool值等

當需要儲存大量的數據時,比如需要離線緩存一些數據,就需要使用數據庫了,sqlit3是c語言的東西,使用起來不是特別方便,而FMDB是oc對其的封裝使用起來比較方便,所以一般開發當中都是使用FMDB

VFL(可視化格式語言)有幾個標示符?

VFL:Visual Format Language 可視化格式語言
H:水平方向
V: 垂直方向
| 表示父視圖
-  本身表示一段距離
-距離- 就表示指定距離
視圖本身的寬度
[字符串表示的視圖] 表示自動布局當前視圖 參照視圖
[字符串表示的視圖(視圖的寬高 或者 最小最大的寬高或者相對寬高)]; 注意:()不要丟掉
H:|-50-[view1(>=100)]-50-|
V:|-100-[view1(30)]
使用自動布局的步驟:
1.使用自動布局 autulayout    frame 就會失效 ——>不需要再去設置視圖的frame
   使用代碼自動布局的時候 需要禁用   translatesAutoresizingMaskIntoConstraints   =NO
2.綁定視圖與字符串
3.添加約束

中國語言
橫向:距離父視圖左側100 視圖本身的寬度最小是100 距離父視圖右側是100
豎向:距離父視圖頂部150 視圖本身的高度是40

可視化語言
H:|-100-[view(>=100)]-100-|
V:|-150-[view(40)]

推送流程:

1、首先要有APPID;
2、根據 APP ID 創建推送證書(根據需要創建不同環境下的推送證書)
3、再向推送平臺提供推送證書
4、向蘋果服務器發送設備信息 接收蘋果服務器發送回來的deviceToken
5、向推送服務器發送deviceToken
6、再推送服務器設置接收推送的用戶 以及推送的消息內容 并發給蘋果服務器
7、蘋果服務器根據 deviceToken 向用戶發送設置好的推送消息
8、手機端接收到推送消息 在自己的應用中顯示

NSArray 和 NSSet的區別?

NSSet :
1、無序的、不重復的;存放到NSSet中的內容并不會排序與添加順序也沒有關系
2、通過anyObject來訪問單個元素
3、遍歷NSSet中的每個元素。通過forin循環來遍歷
4、好處:效率高。
5、應用場景:

比如重用Cell的時候,從緩存池中隨便獲取一個就可以了,無需按照指定順序來獲取
當需要把數據存放到一個集合中,然后判斷集合中是否有某個對象的時候

*NSArray
1、有序的、可以有重復對象。對象的順序是按照添加的順序來保存的
2、好處:有序訪問
3、應用場景:在絕大多數需要依賴順序的情況下(比如tableView的數據源集合,在實際操作中要根據下標來獲取對象)
4、通過下標來訪問

收藏、最近

收藏和最近主要就是使用工具類對數據進行增加和刪除,保存數據時要重寫數據的equalto方法(因為計算機是根據內存地址比較的,而有時候內存地址雖然不同,但是儲存的數據確實一樣的,所以一般根據數據的位置標識(例如id值)比較)

如果是做最近,就需要將上一次的數據刪除,添加新的數據進來,如果在搜藏是需要記錄控件的編輯和選中狀態,就需要在數據模型中添加相應的屬性,利用數據來控制控件的狀態

常出現的問題就是使用tableview時會出現循環利用的問題,這個問題就可以使用數據的值來避免,每次加載cell時,他的狀態是受數據控制的,數據不會發生循環利用的問題,這個問題也就不會出現了

加載本地圖片有哪些方法?

1、imageNamed
2、dataWithContentsOfFile
3、使用[UIImage imageWithContentOfFile:] 或者[image initWithContentOfFile:]

這些知識我整理的一小部分,如果有什么錯誤,希望指出,我們共同進步。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,214評論 30 472
  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛閱讀 2,014評論 0 7
  • 多線程、特別是NSOperation 和 GCD 的內部原理。運行時機制的原理和運用場景。SDWebImage的原...
    LZM輪回閱讀 2,043評論 0 12
  • 史上最全的iOS面試題及答案 iOS面試小貼士———————————————回答好下面的足夠了----------...
    Style_偉閱讀 2,434評論 0 35
  • 1.寫一個NSString類的實現 +(id)initWithCString:(c*****t char *)nu...
    韓七夏閱讀 3,805評論 2 37