IOS 面试题
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就不会。