1.NSNotification和KVO的区别和用法是什么 ?什么时候该使用通知,什么时候该使用KVO,它们在实现上有什么区别?如果用delegate 和protocol来实现类似的功能可能吗?如果可能会有什么潜在的问题?如果不能为什么 ?
KVO只能监测属性的变化,但是实现了自动监测,当属性值变化时,会自动通知观察者
NSNotification比较灵活,可以监测的内容较多,但是需要被观察者手动发送通知,观察者才能响应。
protocol通过添加一个NSArray也能实现类似的功能,但是实现上需要自己处理delegate的添加与删除,自己在属性变化时手动通知,较繁琐,易出错。
2.main文件中UIApplicationMain有几个参数,作用是什么
UIApplicationMain它接受4个参数。 其中argc和argv两个参数来自于main()接受的两个参数;另外两个String型参数分别表示程序的主要类(principal class)和代理类(delegate class)。如果主要类(principal class)为nil,则默认为UIApplication UIApplicationMain会根据principalClassName创建UIApplication对象,然后根据delegateClassName创建一个delegate对象
3. 什么时候使用NSMutableArray,什么时候使用NSArray?
当数组在程序运行时,需要不断变化的,使用NSMutableArray,当数组在初始化后,便不再改变的,使用NSArray。需要指出的是,使用NSArray只表明的是该数组在运行时不发生改变,即不能往NSAarry的数组里新增和删除元素,但不表明其数组內的元素的内容不能发生改变。NSArray是线程安全的,NSMutableArray不是线程安全的,多线程使用到NSMutableArray需要注意。
4. nil和Nil有什么区别
nil表示一个Objctive-C对象,这个对象的指针指向空。Nil定义一个指向空的类(是Class,而不是对象)
5. 谈谈对MVC的理解
简单的理解: V对M是不能通讯的。 C对M通讯:API M对C通讯:Notification,KVO C对V通讯:Outlet V对C通讯:Target-action, Delegate,Datasource
5. NSInteger与int有何不同
#if __LP64__ || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif
6. id 声明的对象有什么特性?
Id 声明的对象具有运行时的特性,即可以指向任意类型的objcetive-c的对象;
7. Objective-C内存管理的方式。你了解几种
Objective-C的内存管理主要有三种方式ARC、手动内存计数、自动释放池(autoreleasepool)
8.如何测试App的性能
Porfile-> Activity monitor
9. 如何检测App内存泄露
Porfile->Leaks
10.如何过滤数组
// 数据源
NSArray *dataArr = [NSArray arrayWithObjects:@"a1", @"abc1", @"abc4", @"abc2", nil];
// 过滤对象
NSArray *filterArr = [NSArray arrayWithObjects:@"abc1", @"abc2", nil];
// 过滤器
NSPredicate *thePredicate = [NSPredicate predicateWithFormat:@"NOT (SELF in %@)", filterArr];
// 过滤后的新数组
NSArray *resultArr = [[NSArray alloc]initWithArray:[dataArr filteredArrayUsingPredicate:thePredicate]];
NSLog(@"过滤后的结果:%@",resultArr);
11. UITableView继承那个类?UIScrollView继承那个类?UIView继承那个类?
UITableView 继承 UIScrollView
UIScrollView 继承 UIView
UIView 继承 UIResponder
12. UIView和UIWindw的关系?UIWindow的作用
UIWindow 继承UIView。
作用:
1.UIWindow作为一个容器,放所有的UIView
2.将事件(例如:点击事件、拖拉事件等)分发给 view。
14. 浅复制和深复制的区别?
浅层复制:只复制指向对象的指针,而不复制引用对象本身。
深层复制:复制引用对象本身。
15. 响应者链是什么?
事件被交由第一响应者对象处理,如果第一响应者不处理,事件被沿着响应者链向上传递,交给下一个响应者。一般来说,第一响应者是个视图或控件,并且首先对事件进行响应,如果第一响应者不处理该事件,事件就会被传递给它的视图控制器,如果此视图控制器不处理该事件,则将事件传递给父视图,如果父视图没有响应,则该事件转到父视图控制器,以此类推,直到顶层视图。接下来会沿着顶层视图到窗口(UIWindow对象)再到程序(UIApplication对象)。如果UIApplication不响应该事件,该事件逐渐进入睡眠状态。
16.[[UIScreen mainScreen] bounds]和applicationFrame的区别
bounds就是屏幕的全部区域,applicationFrame就是app显示的区域,不包含状态栏
17.何时用Delegate和何时用Block?
公共接口,方法较多也选择用delegate ,异步和简单的回调用block更好
18.在一个对象的方法里面:self.name = “object”;和name =”object”有什么不同吗?
self.name = “object”会调用对象的setName()方法,
name = “object”会直接把object赋值给当前对象的name 属性。
并且 self.name 这样retainCount会加1,而name就不会。