Objective-C面试试题集锦

5星 · 超过95%的资源 需积分: 10 6 下载量 91 浏览量 更新于2024-09-17 收藏 38KB DOC 举报
"这是一份Objective-C面试题集,涵盖了指针操作、内存管理、宏定义、类设计、语言特性等多个方面,旨在测试面试者对Objective-C编程语言的深入理解和应用能力。" 1. 题目涉及了数组和指针的关系。在C语言中,数组名是一个指向其首元素的指针。`*(a+1)`表示访问数组a的第二个元素(值为2)。而`&a+1`是指向a数组之后的地址,将其转换为整型指针后,`*(ptr-1)`会访问到数组a的最后一个元素(值为5)。 2. 在C++中,`sizeof(str)`在函数内部计算的是字符串长度(不包括结束符'\0'),因此值为100。`sizeof(p)`是分配的内存大小,对于指针来说,其大小通常为4(32位系统)或8(64位系统)。 3. 这个问题是关于Objective-C中的字符串处理。`getNSString()`函数返回一个`NSString`对象,`NSString *aString`通过`stringWithString:`方法创建了一个新的对象,这个方法会复制传入字符串的内容。`NSLog`会打印出新创建的字符串`"This is a main test\n"`。 4. 宏定义常量可以写作`#define SECONDS_IN_YEAR 31536000`。宏MIN可以写作`#define MIN(x, y) ((x) < (y) ? (x) : (y))`,它会比较两个参数并返回较小的那个。 5. 委托(Delegate)的interface通常包含一系列的方法声明,这些方法用于接收和处理委托对象的事件或消息。例如: ```objc @protocol MyDelegate <NSObject> - (void)actionPerformed:(id)sender; @end ``` 6. `NSString`类的实现部分可能如下: ```objc @implementation NSString (MyStringCategory) - (id)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding { self = [super initWithBytes:nullTerminatedCString length:strlen(nullTerminatedCString) encoding:encoding]; if (self) {} return self; } - (void)dealloc { [super dealloc]; } @end ``` 这里定义了一个类别,实现了`initWithCString:`方法来初始化字符串,并覆盖了`dealloc`方法进行适当的内存释放。 7. Objective-C不支持多重继承,但可以通过协议(Protocol)实现类似的功能,组合多个行为。私有方法可以在类扩展(Category)中声明,仅在该类的.m文件中可见。私有变量通常使用实例变量(_ivar)并在分类中声明为`@private`。 8. 关键字`const`用于声明常量,表示变量不可修改。`volatile`用于指示变量的值可能会被意想不到的因素(如硬件中断)改变。例如: - `const int maxValue = 100;` 声明一个不可变的整数常量。 - `volatile int timerCounter;` 当计时器中断发生时,timerCounter的值可能会改变。 - `volatile float sensorReading;` 传感器读数可能随时变化,需要被立即更新。 `static`关键字在函数内部声明变量时,使变量的生命周期贯穿整个程序运行,而非局部于每次函数调用。在全局作用域中,`static`使变量只在本文件可见。`extern "C"`用于C++中,保持C语言的链接性,避免名称修饰问题。 10. 头文件的保护结构防止了重复包含。如果文件`vxWorks.h`已经被包含过,`#ifndef __INCvxWorksh`将阻止进一步的包含,防止编译错误。 11. `#import`是Objective-C中的头文件包含指令,类似于C/C++的`#include`,但提供了防止重复包含的特性。`@class`用来前置声明类,告诉编译器该类存在,而不需要包含它的头文件。 12. MVC(Model-View-Controller)模式是一种软件设计模式,将应用程序分为三部分:模型(Model)处理数据和业务逻辑,视图(View)负责用户界面,控制器(Controller)协调模型和视图的交互。 13. 进程是程序的执行实例,拥有独立的内存空间,包括堆、栈和数据段。线程是进程内的执行单元,共享进程的内存,有自己的栈。DLL(动态链接库)也有自己的代码和数据空间,但它们的堆栈是与调用它的进程相关的。 14. 进程间的通信方式包括管道、套接字、信号量、共享内存等。线程间的通信主要通过共享内存和线程同步机制(如互斥锁、条件变量)。 15. 线程与进程的主要区别在于资源管理和执行粒度。线程轻量级,切换更快,但共享资源可能导致竞态条件;进程则拥有独立的资源,更安全,但创建和销毁开销大。联系在于线程是进程内的执行单元,多个线程可以并发执行在一个进程中。 这些面试题涵盖了Objective-C语言的基础知识,内存管理,程序设计模式,以及多线程和系统级概念,是评估开发者技术能力的有效工具。