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
它只占用部分屏幕空間來呈現信息,而且顯示在屏幕的最前面