iPhone开发、ObjectiveC_面试题目
1、ObjC中,与alloc语义相反的方法是dealloc还是release?与retain语义相反的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么? t2、在一个对象的方法里面: tself.name = “object”;和tname =”object” t有什么不同吗? t3、这段代码有什么问题吗: t@implementation Person t- (void)setAge:(int)newAge { tself.age = newAge; t} t@end t4、什么是retain count? t5、以下每行代码执行后,person对象的retain count分别是多少tPerson *person = [[Person alloc] init]; t[person retain]; t[person release]; t6、为什么很多内置类如UITableViewController的delegate属性都是assign而不是retain的? t7、定义属性时,什么情况使用copy,assign,和retain t8、autorelease的对象是在什么时候被release的? t9、这段代码有什么问题,如何修改t10、for (int i = 0; i < someLargeNumber; i++) { tNSString *string = @”Abc”; tstring = [string lowercaseString]; tstring = [string stringByAppendingString:@"xyz"]; tNSLog(@“%@”, string); t} t11、autorelease和垃圾回收机制(gc)有什么关系? t12、IPhone OS有没有垃圾回收(gc)? t13、什么是Notification? t14、什么时候用delegate,什么时候用Notification? t15、什么是KVC和KVO?在iOS开发中,Objective-C是主要的编程语言之一,尤其对于iPhone应用开发。这里我们讨论的是Objective-C的一些核心概念和面试常问问题。 1. `alloc`与`dealloc`、`retain`与`release`的关系:`alloc`是创建对象并分配内存,`dealloc`用于释放对象内存,而`retain`增加对象的引用计数(`retain count`),`release`减少引用计数。与`alloc`配对使用的是`release`,因为`alloc`初始化了一个对象,所以需要`release`来平衡内存管理。 2. `self.name = "object";`与`name = "object"`的区别:前者通过setter方法设置属性,会触发KVO(Key-Value Observing)和自动引用计数,后者直接赋值不涉及KVO和setter。 3.关于`setAge:`代码的问题:在`setAge:`方法中,直接使用`self.age = newAge;`会导致循环引用,因为`self`隐式地调用了setter,应改为`age = newAge;`以避免。 4. `retain count`是Objective-C中对象的引用计数,表示对象被引用的次数。当`retain count`为0时,对象会被自动释放。 5. `person`对象的`retain count`变化: - `[Person alloc] init]`: +1 - `[person retain]`: +1 - `[person release]`: -1 6. `UITableViewContoller`的`delegate`属性设为`assign`而不是`retain`,是为了防止循环引用,因为`delegate`通常也是控制器,如果互相持有,会导致内存泄露。 7. `copy`用于创建对象的副本,确保属性的独立性;`assign`用于基本类型或对象指针,不做内存管理;`retain`用于保留对象,增加引用计数。 8. `autorelease`的对象在当前作用域结束或者由`autoreleasepool`决定的适当时间被`release`。 9.未给出具体代码,但通常问题可能在于局部变量生命周期结束后,其引用的对象仍被其他地方使用,导致悬空指针。 10.示例代码中,每次循环都创建了新的字符串对象,但没有释放旧的,可能导致内存泄漏。可以使用可变字符串进行拼接,然后在循环外打印结果。 11. `autorelease`与垃圾回收机制(gc)无直接关系,Objective-C使用的是引用计数内存管理,而非垃圾回收。 12. iOS操作系统没有垃圾回收机制,依赖于手动的内存管理和autorelease。 13. `Notification`是Objective-C中的事件通知机制,允许对象间异步通信。 14.使用`delegate`适合一对一通信,控制流程;`Notification`适合一对多广播,告知多个对象某事件的发生。 15. `KVC`(Key-Value Coding)允许间接访问对象的属性,不需知道具体的setter或getter方法;`KVO`则能在属性改变时自动通知观察者。 16. `Notification`是一对多广播,不关心接收者的具体实现,而`KVO`关注单个属性的改变,且自动通知观察者。 17. `KVO`在Objective-C中通过ISA-swizzling实现,即运行时动态修改类的方法实现来添加观察者代码。 18. `loadView`在视图控制器的视图未加载时调用,用于创建视图;`viewDidLoad`在视图加载完成时调用,可进行初始化设置;`viewDidUnload`在内存紧张时调用,用于释放视图资源;自定义时,应根据需求在这些方法中添加相应的工作。 19. `didReceiveMemoryWarning`在系统认为内存不足时调用,默认操作是释放可复用的非关键资源,自定义时,需要考虑哪些资源可以在不影响功能的前提下释放。这些知识点涵盖了Objective-C内存管理、对象生命周期、消息传递、观察者模式以及视图控制器的基本流程,对于iOS开发者来说至关重要。理解和掌握这些概念是成为一名合格的iOS开发者的基础。
14.04KB
文件大小:
评论区