iOS面试知识点精讲:Objective-C与内存管理

5星 · 超过95%的资源 需积分: 3 53 下载量 55 浏览量 更新于2024-07-28 收藏 34KB DOCX 举报
“iOS面试题归总,涵盖Objective-C语言特性、内存管理、多线程、进程等核心概念。” 在iOS开发中,面试常常会涉及Objective-C的基础知识和苹果开发的特定概念。以下是对这些面试题的详细解答: 1. **Objective-C有多继承吗?没有的话用什么代替?** Objective-C不支持多继承,而是通过协议(Protocol)来实现类似的功能。协议允许一个类遵循多个协议,从而实现接口的扩展,而无需继承多个父类。 2. **Object-C有私有方法吗?私有变量呢?** 在Objective-C中,可以通过在类别(Category)中声明私有方法,使用`@private`关键字修饰私有变量。私有方法通常在类扩展(Class Extension)中声明,确保它们不会对外公开。 3. **关键字const的含义** `const`关键字用于声明常量,表示变量的值不应被修改。根据不同的声明方式,它可以在指针、变量或指针的指针上应用,限制不同级别的可变性。 4. **关键字volatile有什么含义?并给出三个不同例子?** `volatile`关键字用于告诉编译器变量的值可能在程序运行时由外部因素(如硬件中断、多线程环境中的其他线程)改变。例子: - 在多线程编程中,当一个线程修改了一个`volatile`变量,其他线程会立即注意到变化。 - 当访问硬件寄存器时,因为寄存器的值可能会被硬件设备更改,所以应使用`volatile`。 - 在实时系统中,`volatile`用于标记那些可能随时改变的变量。 5. **static的作用** `static`关键字在Objective-C中主要有两层含义:在函数内部定义的`static`变量在程序运行期间只会初始化一次;在类方法中,`static`用于声明类级别的变量,而不是实例级别的。 6. **#import与#include的区别,@class代表什么?** `#import`是Objective-C的预处理器指令,处理头文件时会防止重复导入,而`#include`则不会。`@class`用于前置声明类,表明该类的存在,而不需要包含它的头文件。 7. **线程与进程的区别?** 进程是操作系统分配资源的基本单位,每个进程有自己的内存空间;线程是执行的基本单位,同一进程内的线程共享进程的内存空间,但拥有独立的执行上下文。 8. **堆与栈的区别?** 栈内存用于存储局部变量和函数调用信息,由系统自动分配和释放;堆内存用于动态分配,需要程序员手动管理,如使用`malloc`或`calloc`分配,`free`释放。 9. **Objective-C的内存管理?** Objective-C使用引用计数(Reference Counting)进行内存管理,通过`retain`、`release`、`autorelease`方法控制对象的生命周期。ARC(Automatic Reference Counting)是现代Objective-C中的内存管理机制,自动处理对象的引用计数。 10. **为什么很多内置的类,如TableViewController的delegate的属性是assign不是retain?** delegate通常采用弱引用(weak),避免形成循环引用导致内存泄漏。如果使用`retain`,可能导致delegate对象不能正确释放,因为两者之间形成了强引用关系。 这些面试问题涵盖了Objective-C的关键特性,理解并掌握这些知识对于iOS开发者来说至关重要。在实际面试中,面试官还会关注候选者对苹果开发框架的理解,如UIKit、Foundation,以及最佳实践和实际项目经验。