Objective-C面试关键点:指针与数组深度解析

4星 · 超过85%的资源 需积分: 9 15 下载量 38 浏览量 更新于2024-09-14 1 收藏 28KB DOCX 举报
"Objective-C重要面试题" 面试中关于Objective-C的问题通常涉及到语言的基础概念、内存管理、消息传递、类别(Category)、协议(Protocol)、 Blocks、GCD (Grand Central Dispatch)、KVC (Key-Value Coding) 和 KVO (Key-Value Observing) 等。以下是针对提供的部分内容进行的详细解释: 1. **数组和指针操作**: 在这段代码中,`main()` 函数展示了数组和指针的交互。`*(a+1)` 访问的是 `a` 数组的第二个元素,即 `a[1]`,其值为 2。`&a` 是数组的地址,而 `&a+1` 并非简单的地址加一,因为 `a` 是一个数组,所以地址加一是基于整个数组的大小,即 `5 * sizeof(int)`。因此,`int*ptr=(int*)(&a+1);` 实际上让 `ptr` 指向了 `a[5]`,即数组结尾之后的位置。这里要注意,`ptr` 和 `(&a+1)` 类型不同,前者是 `int*`,后者是 `int(*)[5]`。因此,`ptr-1` 只会减去 `sizeof(int*)` 的值,返回到 `a[4]`,其值为 5。 2. **sizeof 运算符**: `sizeof` 运算符用于计算变量或数据结构占用的内存大小。在 `Func(char str[100])` 函数中,当数组 `str` 作为参数传入时,它在函数内部实际上被视为指向第一个元素的指针,因此 `sizeof(str)` 返回的是指针的大小,即在32位 Windows NT 下的 4 字节。同样,`malloc(100)` 分配了 100 个字节的内存,但 `sizeof(p)` 仅返回指针 `p` 的大小,也是 4 字节。 3. **Objective-C 方法和指针**: 题目中提到的 `- (void)*getNSString(const NSString* inputString)` 方法看起来有误,因为 Objective-C 方法的返回类型不能是 `void*`。正确的方法声明应该是 `- (NSString*)getNSString:(const NSString*)inputString`。在 `main` 函数中,`getNSString(a)` 应该返回一个新的字符串,然后 `aString` 被设置为此返回值。然而,当前方法实现试图将一个 NSString 对象赋值给方法名,这是不合法的。正确的做法是在方法体中创建并返回新的 NSString 对象。 扩展知识点: - **Objective-C 的消息传递**:Objective-C 使用消息传递机制,通过 `[receiver message]` 的形式调用方法。 - **ARC (Automatic Reference Counting)**:Objective-C 采用 ARC 进行内存管理,自动跟踪和管理对象的生命周期。 - **类别(Category)**:类别可以扩展已有的类,添加方法而不影响其他代码。 - **协议(Protocol)**:协议定义了一组方法签名,可以被多个类遵循,实现多态性。 - ** Blocks**:Objective-C 支持内联块,可用来定义匿名函数。 - **GCD (Grand Central Dispatch)**:GCD 是苹果的并发编程框架,用于处理多线程和异步任务。 - **KVC 和 KVO**:KVC 允许通过键来访问对象的属性,而无需公开 getter 和 setter。KVO 提供了观察和响应对象属性变化的能力。 在面试中,理解这些核心概念并能正确应用是至关重要的。对于Objective-C开发者来说,深入理解内存管理、面向对象编程以及多线程编程等技术是非常基础且必要的。