亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

iOS基礎面試題

2019-11-14 18:02:11
字體:
來源:轉載
供稿:網友

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

  • readwrite 是可讀可寫特性;需要生成getter方法和setter方法時;
  • readonly 是只讀特性 只會生成getter方法 不會生成setter方法 ;不希望屬性在類外改變時;
  • assign 是賦值特性,setter方法將傳入參數賦值給實例變量;僅設置變量時,一般用于基礎數據類型;
  • retain 表示持有特性,setter方法將傳入參數先保留,再賦值,傳入參數的retaincount會+1,也就是說release舊值,retain新值;一般用于OC對象;
  • copy 表示賦值特性,setter方法將傳入對象復制一份;需要完全一份新的變量時,也就是release舊值,copy新值;一般用于NSString/NSMutableString/block;
  • nonatomic 非原子操作,決定編譯器生成的setter getter是否是原子操作,atomic表示多線程安全,一般使用nonatomic。

2.#import 跟#include、@class有什么區別?#import<> 跟 #import”"又什么區別?
1).#import和#include都能完整地包含某個文件的內容,#import能防止同一個文件被包含多次。
2). @class和#import

  • 作用上的區別:
    #import會包含引用類的所有信息(內容), 包括引用類的變量和方法;
    @class僅僅是告訴編譯器有這么一個類, 具體這個類里有什么信息, 完全不知;
  • 效率上的區別:
    如果有上百個頭文件都#import了同一個文件,或者這些文件依次被#import,那么一旦最開始的頭文件稍有改動,后面引用到這個文件的所有類都需要重新編譯一遍 , 編譯效率非常低;
    相對來講,?
    3). #import <> 用來包含系統自帶的文件,#import “”用來包含自定義的文件。

3.OC有多繼承嗎?沒有的話用什么代替?
OC中沒有多繼承,可以用委托代理PRotocol來實現。

4.Objective-C如何對內存管理的?內存管理的原則是?
Objective-C的內存管理主要有三種方式ARC(自動引用計數)、MRC(手動內存計數)、autorelease(自動釋放池)。
每個對象都有一個引用計數器,每個新對象的計數器是1,當對象的計數器減為0時,就會被銷毀。
?內存管理原則(配對原則):只要出現了 new/alloc/retain,就一定配對出現一個release/autorelease。

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

6、淺復制和深復制的區別?
淺復制:只復制指向對象的指針,而不復制引用對象本身。
深復制:復制引用對象本身。
意思就是說我有個A對象,復制一份后得到A_copy對象后,對于淺復制來說,A和A_copy指向的是同一個內存資源,復制的只不過是是一個指針,對象本身資源還是只有一份,那如果我們對A_copy執行了修改操作,那么發現A引用的對象同樣被修改,這其實違背了我們復制拷貝的一個思想。深復制就好理解了,內存中存在了兩份獨立對象本身。
用通俗的話講就是:淺復制好比你和你的影子,你完蛋,你的影子也完蛋;深復制好比你和你的克隆人,你完蛋,你的克隆人還活著。

7、分類的作用?分類和繼承的區別?
分類可以在不獲悉,不改變原來代碼的情況下往里面添加新的方法,只能添加,不能刪除修改,并且如果分類和原來類中的方法產生名稱沖突,則分類將覆蓋原來的方法,因為分類具有更高的優先級。
繼承可以增加,修改或者刪除方法,并且可以增加屬性;但是分類只能添加方法,不能刪除修改,也不能增加屬性。

8、frame和bounds有什么不同?
frame指的是:該view在父view坐標系統中的位置和大小。(參照點是父親的坐標系統)
bounds指的是:該view在本身坐標系統中 的位置和大小。(參照點是本身坐標系統)

9、HTTP協議中,POST和GET的區別是什么?
1).GET 方法:

  • GET 方法提交數據不安全,數據置于請求行,客戶端地址欄可見;
  • GET 方法提交的數據大小有限
  • GET 方法不可以設置書簽
    2).POST 方法:
  • POST 方法提交數據安全,數據置于消息主體內,客戶端不可見
  • POST 方法提交的數據大小沒有限制
  • POST 方法可以設置書簽
    10、視圖控制器的生命周期方法調用順序?

11、block和代理的區別,哪個更好?
代理回調更面向過程,block更面向結果。如果需要在執行的不同步驟時被通知,你就要使用代理。如果只需要請求的消息或者失敗的詳情,應該使用block。block更適合與狀態無關的操作,比如被告知某些結果,block之間是不會相互影響的。但是代理更像一個生產流水線,每個回調方法是生產線上的一個處理步驟,一個回調的變動可能會引起另一個回調的變動。要是一個對象有超過一個的不同事件,應該使用代理。一個對象只有一個代理,要是某個對象是個單例對象,就不能使用代理。要是一個對象調用方法需要返回一些額外的信息,就可能需要使用代理。

12、自動釋放池常見面試代碼

for (int i = 0; i < 10; ++i) {???       NSString *str = @"Hello World";???       str = [str stringByAppendingFormat:@" - %d", i];???       str = [str uppercaseString];??? NSLog(@"%@", str);}

問:以上代碼存在什么樣的問題?如果循環的次數非常大時,應該如何修改?

  • 解決辦法1:如果i比較大, {}解決,放在for循環外,循環結束后,銷毀創建的對象,解決占據棧區內存的問題
  • 解決方法2:如果i玩命大,一次循環都會造成自動釋放池被填滿,自動釋放池放在for循環內,每次循環都將上一次創建的對象release。
    13、iOS怎么做數據的持久化?
    1).plist屬性列表
  • 適用對象:僅僅是Foundation框架中自帶的一些類,比如NSString、、NSArray、NSDictionary、NSSet、NSNumber、NSData
  • 調用對象的writeToFile...方法就可以寫入文件
  • 調用對象的...WithContentsOfFile方法就可以從文件中讀取對象內容
    2).偏好設置(NSUserDefault)
  • 本質還是plist屬性列表的方式進行存儲
  • 存取非常簡單(不關心文件夾和文件名)
  • 缺點:只能存儲到一個文件中(不能存放大批量數據)
    3).NSCoding
  • 能將任何遵守了NSCoding協議的對象塞進文件中
  • - (void)encodeWithCoder:(NSCoder *)encoder?將對象歸檔的時候會調用(將對象寫入文件之前會調用)這個方法,?在這個方法說清楚:a、那些屬性需要存儲? b、怎樣存儲這些屬性;
  • - (id)initWithCoder:(NSCoder *)decoder當從文件中解析對象的時候調用這個方法,在這個方法說清楚:a、那些屬性需要解析(讀?。?b、怎樣解析(讀取)這些屬性;
  • 如果父類也有屬性需要歸檔或者讀檔,必須調用super的encodeWithCoder:和initWithCoder:方法。
    14、APNS的推送機制
    首先我們看一下蘋果官方給出的對iOS推送機制的解釋。如下圖:

    Provider就是我們自己程序的后臺服務器,APNS是Apple Push Notification Service的縮寫,也就是蘋果的推送服務器。
    上圖可以分為三個階段:
    第一階段:應用程序的服務器端把要發送的消息、目的iphone的標識打包,發給APNS。
    第二階段:APNS在自身的已注冊Push服務的iPhone列表中,查找有相應標識的iPhone,并把消息發送到iPhone。
    第三階段:iPhone把發來的消息傳遞給相應的應用程序,并且按照設定彈出Push通知。
    15、控制器View的加載過程?
    當程序訪問了控制器的View屬性時會先判斷控制器的View是否存在,如果存在就直接返回已經存在的View;如果不存在,就會先調用loadView這個方法;如果控制器的loadView方法實現了,就會按照loadView方法加載自定義的View;如果控制器的loadView方法沒有實現就會判斷storyboard是否存在;如果storyboard存在就會按照storyboard加載控制器的View;如果storyboard不存在,就會創建一個空視圖返回。
    16、UITableView的數據源方法和代理方法?
    數據源常見方法:
1.有多少組- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView2.第section組頭部控件有多高- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section3.第section組有多少行- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section4.indexPath這行的cell有多高- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath5.indexPath這行的cell長什么樣子- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 6.第section組頭部顯示什么控件- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section

代理方法:

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView   //右側索引- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath   //行點擊事件NSIndexPath *path = [self.tableView indexPathForSelectedRow];     //獲得被選中的indexPath可以得到section,row[self.tableView reloadRowsAtIndexPaths:[self.tableView indexPathsForSelectedRows] withRowAnimation:UITableViewRowAnimationNone];    //刷新table指定行的數據? ? ? ?[self.tableView reloadData];       //刷新table所有行的數據

17、UITableViewCell表格優化?
UITableViewCell對象的重用原理:當滾動列表時,部分UITableViewCell會移出窗口,UITableView會將窗口外的UITableViewCell放入一個對象池中,等待重用。當UITableView要求dataSource返回UITableViewCell時,dataSource會先查看這個對象池,如果池中有未使用的UITableViewCell,dataSource會用新的數據配置這個UITableViewCell,然后返回給UITableView,重新顯示到窗口中,從而避免創建新對象。
還有一個非常重要的問題:有時候需要自定義UITableViewCell(用一個子類繼承UITableViewCell),而且每一行用的不一定是同一種UITableViewCell(如短信聊天布局),所以一個UITableView可能擁有不同類型的UITableViewCell,對象池中也會有很多不同類型的UITableViewCell,時可能會得到錯誤類型的UITableViewCell那么UITableView在重用UITableViewCell。解決方案:UITableViewCell有個NSString *reuseIdentifier屬性,可以在初始化UITableViewCell的時候傳入一個特定的字符串標識來設置reuseIdentifier(一般用UITableViewCell的類名)。當UITableView要求dataSource返回UITableViewCell時,先通過一個字符串標識到對象池中查找對應類型的UITableViewCell對象,如果有,就重用,如果沒有,就傳入這個字符串標識來初始化一個UITableViewCell對象。
18、在一個對象的方法里面:self.name = @"object";name =@"object";有什么不同嗎?
self.name = @"object";會調用對象的setName()方法,name =@"object";會直接把@"object"賦值給當前對象的name 屬性。
19、為什么很多內置類如UITableViewController的delegate屬性都是assign而不是retain的?
會引起循環引用
所有的引用計數系統,都存在循環應用的問題。例如下面的引用關系:
? 對象a創建并引用到了對象b.
? 對象b創建并引用到了對象c.
? 對象c創建并引用到了對象b.這時候b和c的引用計數分別是2和1。
當a不再使用b,調用release釋放對b的所有權,因為c還引用了b,所以b的引用計數為1,b不會被釋放。b不釋放,c的引用計數就是1,c也不會被釋放。從此,b和c永遠留在內存中。這種情況,必須打斷循環引用,通過其他規則來維護引用關系。我們常見的delegate往往是assign方式的屬性而不是retain方式 的屬性,賦值不會增加引用計數,就是為了防止delegation兩端產生不必要的循環引用。如果一個UITableViewController 對象a通過retain獲取了UITableView對象b的所有權,這個UITableView對象b的delegate又是a, 如果這個delegate是retain方式的,那基本上就沒有機會釋放這兩個對象了。自己在設計使用delegate模式時,也要注意這點。
20、什么是Notification?
觀察者模式,controller向defaultNotificationCenter添加自己的notification,其他類注冊這個notification就可以收到通知,這些類可以在收到通知時做自己的操作(多觀察者默認隨機順序發通知給觀察者們,而且每個觀察者都要等當前的某個觀察者的操作做完才能輪到他來操作,可以用NotificationQueue的方式安排觀察者的反應順序,也可以在添加觀察者中設定反映時間,取消觀察需要在viewDidUnload 跟dealloc中都要注銷)。
21、單例模式的作用?程序中有哪些常見的單例?單例的實現步驟?

  • 單例模式的作用是解決“應用中只有一個實例”的一類問題。
  • dispatch_once函數是由GCD提供的,它的作用是在整個應用程序生命周期中只執行一次代碼塊。dispatch_once_t是由GCD提供的結構體,使用時需要將GCD地址傳給dispatch_once函數。dispatch_once函數能夠記錄該代碼是否被調用過。
  • dispatch_once函數不僅意味著代碼僅會被執行一次,而且還意味著此運行還是線程同步的。也就是說,當我們使用dispatch_once函數時,。
  • 應用案例:UIapplication、NSUserDefaults、NSNotificationCenter、NSFileManager、NSBundle
  • UIApplication:
    UIApplication類的實例提供了應用程序的集中控制點來保持應用的狀態。UIApplication實例總是分配給應用程序委托對象(UIApplicationDelegate),通過應用程序委托對象來響應低內存、應用啟動、后臺運行和應用終止等事件。
  • NSUserDefaults:
    單例類NSUserDefaults可以很方便的讀取應用設置項目。
  • NSNotificationCenter:
    單例類NSNotificationCenter提供信息廣播通知,它采用觀察者模式的通知機制。
  • NSFileManager:
    NSFileManager提供了訪問文件系統的通用操作,可以定位、創建、復制文件和文件夾。
  • NSBundle:
    NSBundle提供了動態加載(或卸載)可執行代碼、定位資源文件以及資源文件本地化、訪問系統文件等功能。
  • 要實現一個Singleton Class, 至少需要做以下四個步驟:
  1. 為Singleton Object實現一個靜態實例, 初始化, 然后設置成nil.
  2. 實現一個實例構造方法(通常命名為 sharedInstance 或者 sharedManager)檢查上面聲名的靜態實例是否為nil, 如果是則新建并返回一個本類實例.
  3. 重寫 allocWithZone: 方法來保證當其他人直接使用 alloc 和 init 試圖獲得一個新實例的時候不會產生一個新的實例.
  4. 適當的實現 copyWithZone:, release, retain, retainCount 和 autorelease.
    22、block使用時的注意點?
    Block可以使用在定義之前聲明的局部變量;

    int i = 10;void(^myBlock)() = ^{ ??? NSLog(@"%d", i);};i = 100;myBlock();
    注意:
  • 在定義Block時,會在Block中建立當前局部變量內容的副本(拷貝)
  • 后續再對該變量的數值進行修改,不會影響Block中的數值
  • 如果需要在block中保持局部變量的數值變化,需要使用__block關鍵字
  • 使用__block關鍵字后,同樣可以在Block中修改該變量的數值
  • 不能直接用點語法調用self的方法,會造成循環引用,要用中括號調用。
    23、@private、@protected、@public、@package類型的成員變量的作用域?
  • @private:只能在當前類的對象方法中訪問;
  • @protected:可以在當前類以及子類的實現中直接訪問,默認類型;
  • @public:任何地方都可以直接訪問對象的成員變量;
  • @package:同一個“體系內”(框架)可以訪問;
    24、這個寫法會出什么問題:@property (copy) NSMutableArray *array;?
    @property 的setter方法設置成copy以后,array這個指針指向的是一個不可變數組,那么當使用點語法為給array賦值時,就會發生“unrecognized selector sent to instance”錯誤,程序就會崩潰。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩乱码在线视频| 久久天天躁狠狠躁夜夜av| 欧美精品videossex88| 91经典在线视频| 国产免费观看久久黄| 久青草国产97香蕉在线视频| 久久久精品视频在线观看| 国产日韩在线观看av| 欧洲美女7788成人免费视频| 国产精品亚洲美女av网站| 欧美成人免费网| 国产精品视频内| 乱亲女秽乱长久久久| 亚洲人成在线免费观看| 亚洲欧美在线免费观看| 国产欧洲精品视频| 欧美综合第一页| 成人xxxxx| 亚洲福利视频网| 91免费精品国偷自产在线| 国产精品jvid在线观看蜜臀| 久久久久国产精品www| 亚洲精品av在线播放| 亚洲aaaaaa| 国产视频在线观看一区二区| 国产91亚洲精品| 97热在线精品视频在线观看| 亚洲精品白浆高清久久久久久| 国产成人精品999| 国产福利成人在线| 中文字幕精品国产| 色婷婷av一区二区三区在线观看| 国产精品99久久99久久久二8| 亚洲国产精久久久久久久| 亚洲激情电影中文字幕| 精品亚洲va在线va天堂资源站| 少妇高潮久久久久久潘金莲| 国产精品美乳一区二区免费| 久久国产精品免费视频| 国产一区二区三区视频在线观看| 亚洲精品久久久久久久久久久| 孩xxxx性bbbb欧美| 久久久精品国产| 国产精品爽爽爽| 69国产精品成人在线播放| 成人www视频在线观看| 欧美精品xxx| 国产精品自拍小视频| 国产精品视频永久免费播放| 欧美壮男野外gaytube| 亚洲天堂av网| 亚洲欧洲午夜一线一品| 日韩av电影免费观看高清| 2019中文字幕在线观看| 色综合久久88| 亚洲国产精品成人精品| 精品一区二区电影| 欧美激情中文字幕乱码免费| 日本久久中文字幕| 欧美在线视频一二三| 一区二区三区亚洲| 综合网日日天干夜夜久久| 国产精品福利小视频| 欧美日韩在线视频首页| 夜夜嗨av色综合久久久综合网| 日韩精品免费在线视频| 国产亚洲精品美女久久久| 国产成人精品日本亚洲专区61| 国产精品久久在线观看| 成人在线国产精品| 亚洲成av人影院在线观看| 青草青草久热精品视频在线观看| 日韩亚洲欧美中文高清在线| 国产欧美一区二区三区四区| 欧美专区在线播放| 国产专区欧美专区| 免费av一区二区| 欧美视频专区一二在线观看| 91香蕉嫩草影院入口| 国产成人avxxxxx在线看| 欧美视频在线观看免费网址| 国产精品电影网站| 国产精品中文字幕在线| 久久综合九色九九| 亚洲精品自拍第一页| 欧美孕妇性xx| 国产精品美女久久久久av超清| 日韩在线观看免费全集电视剧网站| 日韩久久免费电影| 日韩亚洲第一页| 久久夜色精品国产| 欧美激情a在线| 91国内免费在线视频| 91av视频在线免费观看| 九九久久久久久久久激情| 日韩毛片在线看| 91香蕉嫩草神马影院在线观看| 国产美女91呻吟求| 日韩免费看的电影电视剧大全| 高清日韩电视剧大全免费播放在线观看| 亚洲新声在线观看| 国产精品一二区| 色狠狠久久aa北条麻妃| 亚洲第五色综合网| 亚洲另类欧美自拍| 岛国av午夜精品| 全色精品综合影院| 中文字幕亚洲一区二区三区| 日韩av影片在线观看| 成人激情在线播放| 中文国产成人精品久久一| 亚洲乱码国产乱码精品精| 久久精品成人动漫| 黑人精品xxx一区| 久久成人人人人精品欧| 日韩欧美有码在线| 夜夜嗨av一区二区三区免费区| 国产日韩精品一区二区| 91国产高清在线| 国产精品v日韩精品| 成人欧美在线视频| 亚洲在线www| 亚洲一区二区三区乱码aⅴ蜜桃女| 麻豆一区二区在线观看| 国产精品亚洲综合天堂夜夜| 日韩精品高清在线观看| 久久久久这里只有精品| 日本91av在线播放| 国产福利视频一区| 国内久久久精品| 精品无人区太爽高潮在线播放| 亚洲视频在线观看免费| 亚洲国产小视频在线观看| 97福利一区二区| 国内精品一区二区三区四区| 爽爽爽爽爽爽爽成人免费观看| 亚洲美腿欧美激情另类| 久久手机精品视频| 日韩一区二区在线视频| 日韩精品中文字幕在线播放| 亚洲国产精品va在线观看黑人| 亚洲在线免费观看| 国产精品久久久久久中文字| 国产原创欧美精品| 国产亚洲精品一区二555| 久久视频免费观看| 青草青草久热精品视频在线观看| 亚洲国产日韩欧美在线动漫| 国产精品一区二区三区久久久| 成人久久一区二区| 亚洲欧美在线看| 亚洲国产精品大全| 国产精品自在线| 色综合五月天导航| 国产成+人+综合+亚洲欧洲| 91日韩在线播放| 欧美激情手机在线视频| 亚洲国产精久久久久久久| 在线免费观看羞羞视频一区二区| 久久视频在线观看免费| 国产精品嫩草影院一区二区| 伊人伊成久久人综合网站| 91热精品视频| 亚洲国产精品成人va在线观看|