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
它只占用部分屏幕空间来呈现信息,而且显示在屏幕的最前面