iOS初級面試題

1.OC中創建線程的方法是什么?制定在主線程中執行代碼?如何延時執行代碼?

1)有三種: NSThread; NSOperation,NSOperationQueue;GCD;

2)//一種

[self performSelectorOnMainThread:<#(SEL)#> withObject:<#(id)#> waitUntilDone:<#(BOOL)#>];

//二種

[self performSelector:<#(SEL)#> onThread:[NSThread mainThread] withObject:<#(id)#> waitUntilDone:<#(BOOL)#>];

//三種

dispatch_sync(dispatch_get_main_queue(), ^{

});

3)有三種

//一種 使用perform

[self performSelector:<#(SEL)#> withObject:<#(id)#> afterDelay:<#(NSTimeInterval)#>];

//二種 使用NSTimer

[NSTimer scheduledTimerWithTimeInterval:<#(NSTimeInterval)#> target:<#(id)#> selector:<#(SEL)#> userInfo:<#(id)#> repeats:<#(BOOL)#>];

//三種 使用GCD

double delayInSeconds = 2.0;

dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds *NSEC_PER_SEC));

dispatch_after(popTime, dispatch_get_main_queue(), ^{

});

2.#import跟#include,@class有什么區別?#import<>跟#import””有什么區別?

1)#import和#include都能完整地包含某個文件的內容,#import能防止同一個文件被包含多次;

2)@class僅僅聲明一個類名,并不會包含類的完整聲明;@class還能解決循環包含的問題;

3)#import<>用來包含系統自帶的文件,#import""用來包含自定義的文件;

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

1)readwrite和readonly是用在property中,前者能生成set和get方法,后者只能生成get方法;

2)assign用于基本數據,即非對象數據;

3)copy一般用于字符串,retain一般用于對象(ARC里面用strong;);

4)atomic原子性,加鎖,耗內存;nonatomic非原子性,因移動設備內存有限,一般為非原子性,它也一般可以用來修飾UI ,UI是絕對安全,因其只能在主線程,所以不用加鎖;

4.寫一個setter方法用于完成@property (nonatomic, retain) NSString *name,寫一個setter方法用于完成@property (nonatomic, copy) NSString *name;

1)

- (void)setName:(NSString *)name {

if (_name !=name) {

[_name release];

_name = [name retain];

}

2)

- (void)setName:(NSString *)name {

if (_name !=name) {

[_name release];

_name = [name copy];

}

5.語句 NSString *obj = [[NSData alloc] init];在編譯運行時,obj分別的類型;

編譯時是NSString類型;運行時是NSData類型;

6.淺拷貝和深拷貝的區別?

淺拷貝:沒有產生新對象,只是地址的拷貝;

深拷貝:全部內容復制一遍,開辟新的內存空間;

7.分類有什么優點,分類和繼承有什么區別;

1)分類的優點:分類可以在不修改原來類模型的基礎上拓展方法;

2)相似之處:都能擴充新的方法;

區別:

分類:不會產生新的類,分類只能添加方法,不能添加成員變量,一旦實現父類的原方法,會覆蓋父類的方法;

繼承:新建一個子類,如是覆蓋父類的方法,但還是有可能調用父類的方法,父類的操作還是可能會調回來;

8.分類和類擴展的區別:

[ 類擴展(亦匿分類)是:@interface ViewController ()

@end ];

分類:它又名稱;只能擴充方法;

類擴展:沒有名稱;它能擴充成員變量;

9.protocol在object c和java的區別;

java的接口中聲明的方法必須都實現;

oc不一定要實現;

10.KVO和KVC?

kvc:通過一個字符串的key來修改對象的屬性值;

@property (nonatomic, assign) int age;

//id是指OC任意對象,如果是基礎數據類型,要在其前面加上”@”

[self setVaule:@10 forKeyPath:@“age”];

kvo:用來監聽某個對象的屬性;

11.使用代理的目的;

1)傳數據;

2)用來通知一些事情,如tabel的某一行被點了,這個時候要通知代理;

3)解耦;

12.為什么說oc是一門運行時的動態語言;

oc是在運行時才知道對象的數據類型,編譯時只有編譯器知道;

eg:NSString *obj = [[NSData alloc] init];

13.通知和協議的區別?

相同點:都能傳數據;

不同點:

通知:耦合性更低,只要監聽我通知,可以給多個傳對象;

協議:使用協議只能給一個對象傳數據;

14.推送通知;

1)本地推送:

2)遠程推送:

15.什么是多態?

不同對象對同一消息的不同響應.子類可以重寫父類的方法

多態就是允許方法重名 參數或返回值可以是父類型傳入或返回

16.單例?

(最好是單獨新建一個.h的文件,寫成宏的形式;)

// .h文件

#define LBSingletonH(name) + (instancetype)shared##name;

// .m文件

#define LBSingletonM(name) \

static id _instance = nil; \

+ (id)allocWithZone:(struct _NSZone *)zone \

{ \

static dispatch_once_t onceToken; \

dispatch_once(&onceToken, ^{ \

_instance = [super allocWithZone:zone]; \

}); \

return _instance; \

} \

+ (instancetype)shared##name \

{ \

static dispatch_once_t onceToken; \

dispatch_once(&onceToken, ^{ \

_instance = [[self alloc] init]; \

}); \

return _instance; \

} \

- (id)copyWithZone:(NSZone *)zone \

{ \

return _instance; \

}

17.方法和選擇器(selector)如何區別?

1)選擇器:它是用來包裝一個方法,用來找到內存中對應的方法地址,再調用對應的方法;

2)方法:是存于內存中;

18.垃圾回收?

垃圾回收:程序在運行過程中隨機回收一些沒有正在使用的對象;

oc1.0:沒有垃圾回收;

oc2.0:有垃圾回收,但是只用在mac平臺,iOS不支持,因耗內存;

ARC:只不過是編譯器特性,編譯器會自動生成管理內存的代碼;

19.什么是NSOpetation queue?

用來異步執行的操作,一般可用在網絡請求等耗時操作;

20.什么是懶加載?

只加載一次,提升體驗;如:控制器顯示窗口view;

21.一個控制器能不能使用2個tableView?

可以;

22.什么是簡便構造方法;

用來創建對象的類方法;

23.什么是 NSManagedObject model?

NSManagedObject 繼承自NSObject,是一個比較特殊的模型,用法比較復雜;

24.什么是predicate?

使```基于/過濾

NSArray *array = @[@"13",@"abc",@"dfd"];

[array filteredArrayUsingPredicate:<#(NSPredicate *)#>];

[array filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {

return [evaluatedObject rangeOfString:@"a"].length !=0;

}]];

24.const指常量;

25.線程和進程的區別?

線程是用來干事情的,多線程能做多件事;

進程是用來開辟內存空間;

26.堆和棧的區別?

堆放對象,內存是要程序員手動釋放;

棧放局部變量,內存是自動釋放;

block堆和棧都有可能,默認是放在棧;

27.TableView的delegate的屬性是assign不是retain?

為了解決return循環的問題;

28.tableView的重用機制?

循環利用;

29.ViewController的loadView,viewDidLoad,viewDidUnload分別是什么時候調用;

1)省略;

2)省略;

3)當控制器的view因內存不足被系統自動回收;

30.對象是什么時候釋放的?

引用計數器為0時;

31.如何創建一個iPad應用程序

設備支持的應用程序

iPhone上只能運行iPhone程序

iPad上能夠運行iPhone \ iPad程序

開發過程

iPhone和iPad開發的流程是一致的

在iPhone開發中學到的所有知識基本都能用在iPad上

32.什么是UIPopoverController

是iPad開發中常見的一種控制器(在iPhone上不允許使用)

跟其他控制器不一樣的是,它直接繼承自NSObject,并非繼承自UIViewController

它只占用部分屏幕空間來呈現信息,而且顯示在屏幕的最前面



End…………

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

推薦閱讀更多精彩內容

  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,217評論 30 472
  • 史上最全的iOS面試題及答案 iOS面試小貼士———————————————回答好下面的足夠了----------...
    Style_偉閱讀 2,445評論 0 35
  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛閱讀 2,014評論 0 7
  • 多線程、特別是NSOperation 和 GCD 的內部原理。運行時機制的原理和運用場景。SDWebImage的原...
    LZM輪回閱讀 2,043評論 0 12
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,778評論 18 399