iphone面试题

### iPhone面试题详解####一、Objective-C内存管理机制**问题1**:在Objective-C中,与`alloc`语义相反的方法是`dealloc`还是`release`?与`retain`语义相反的方法是`dealloc`还是`release`,为什么?需要与`alloc`配对使用的方法是`dealloc`还是`release`,为什么? - **答案解析**: - `alloc`与`dealloc`语义相反。`alloc`是创建变量,`dealloc`是释放变量。 - `retain`对应`release`,`retain`保留一个对象。调用`retain`之后,变量的引用计数增加1。举例说明: ```objective-c -(void)setName:(NSString*)name { [name retain]; //增加引用计数[myName release]; //减少引用计数myName = name; } ```假设用户在调用这个函数的时候,注意了内存的管理,所以编写了以下代码: ```objective-c NSString *newName = [[NSString alloc] initWithString:@"john"]; [aClass setName:newName]; [newName release]; ```分析`newName`的引用计数的变化过程: - `newName`被`alloc`,其引用计数为1。 -然后,在`setName`中,`newName`被`retain`,其引用计数变为2。 -用户自己释放`newName`,引用计数变为1,此时`myName`指向了`newName`。这也解释了为什么需要调用`[myName release]`。 -需要在给`myName`赋新值之前,释放掉旧的变量。 - `retain`之后直接调用`dealloc`,对象的引用计数不会减少。`alloc`需要与`release`配对使用,因为在调用`alloc`之后,变量的引用计数增加1,所以在调用`alloc`之后,必须调用对应的`release`。 ####二、Self关键字与属性赋值**问题2**:在一个对象的方法里面:`self.name = "object"`与`name = "object"`有什么不同? - **答案解析**: - `self.name = "object"`会调用对象的`setName:`方法。 - `name = "object"`会直接把`"object"`赋值给当前对象的`name`属性。 ####三、引用计数(retain count) **问题3**:什么是`retainCount`? - **答案解析**:引用计数(`retainCount`)是对象内部的一个数值,表示该对象被多少个地方引用。例如,如果某个对象被两个指针所引用,那么它的`retainCount`为2。需要销毁对象的时候,不直接调用`dealloc`,而是调用`release`。`release`会让`retainCount`减1,只有当`retainCount`等于0时,系统才会调用`dealloc`来真正销毁这个对象。 ####四、委托(Delegate)与内置类的属性分配方式**问题4**:为什么很多内置类如`UITableViewController`的`delegate`属性都是`assign`而不是`retain`的? - **答案解析**:使用`assign`而非`retain`是为了避免循环引用的问题。如果`delegate`属性使用`retain`,那么当一个`UITableViewController`持有另一个控制器作为其`delegate`时,另一个控制器也会反过来持有该`UITableViewController`作为其代理,从而形成循环引用,导致内存泄漏。 ####五、键值编码(KVC)与键值观察(KVO) **问题5**:什么是KVC和KVO? - **答案解析**: - **KVC (Key-Value Coding)**:是一种用于获取或设置对象属性值的机制。KVC内部通过方法名称解析来访问对象的属性,例如通过`setValue:forKey:`方法可以直接设置对象的属性值,而不需要知道具体的setter方法名称。 - **KVO (Key-Value Observing)**:是一种用于观察对象属性变化的机制。当一个对象成为另一个对象属性的观察者时,如果该属性发生变化,观察者会收到通知。KVO通过修改对象的`isa`指针指向一个中间类来实现,这样当对象的属性发生改变时,中间类会触发相应的观察者方法。 ####六、通知(Notification) **问题6**:什么是`Notification`? - **答案解析**: `Notification`是一种基于观察者模式的设计模式,允许一个对象向中心通知中心发送消息,其他对象可以通过注册特定的通知来接收这些消息。这有助于解耦对象之间的依赖关系,使得多个对象可以响应同一个事件。 ####七、何时使用委托(Delegate),何时使用通知(Notification) **问题7**:什么时候用`delegate`,什么时候用`Notification`? - **答案解析**: - `delegate`通常用于一对一的关系,其中接收者可以向发送者返回值。例如,一个视图控制器可能需要一个代理来处理某些行为,如数据验证。 - `Notification`可以用于一对多的关系,即一个对象发送通知给多个对象。接收者无法直接向发送者返回值,但可以响应通知并执行相应的操作。例如,当一个对象的状态发生变化时,它可以发布一个通知,所有感兴趣的观察者都可以接收并作出反应。通过以上分析,我们可以看出Objective-C中的内存管理、属性赋值、引用计数以及设计模式(如委托和通知)的重要性。这些概念不仅对于编写高效、可维护的iOS应用程序至关重要,也是面试过程中经常考察的重点内容。
pdf 文件大小:593.18KB