iOS初学者教程:Objective-C内存管理与面试知识点解析

需积分: 0 1 下载量 155 浏览量 更新于2024-09-09 收藏 894KB PDF 举报
"这篇文档是针对iOS初学者的,涵盖了面试中常见的理论知识,由中国移动互联网研发培训专家千锋教育提供,源自清华创新教学方法。文档主要关注Objective-C语言的相关内容,包括内存管理、属性赋值行为、深拷贝与浅拷贝的区别,以及Objective-C中的特定语法和编程习惯。" 在iOS开发中,Objective-C是核心编程语言之一,对于初学者来说,理解其基础理论至关重要。以下是对标题和描述中提到的一些关键知识点的详细解释: 1. **Objective-C的内存管理**:Objective-C使用引用计数机制来管理内存。当一个对象被创建(如使用`alloc`)时,其引用计数初始化为1。每次对象被`retain`,引用计数加1;每次`release`,引用计数减1。当对象的引用计数为0时,会调用`dealloc`方法,对象被销毁。此外,系统维护了一个自动释放池(`autoreleasepool`),在池的生命周期结束时,池中的所有对象都会被`release`。 2. **属性修饰符的区别**: - `assign`:简单赋值,适用于基本数据类型,不做任何内存管理。 - `retain`:保留并增加对象的引用计数,确保对象不会在使用中被意外释放。 - `copy`:执行深拷贝,创建一个新的对象,内容与原对象相同,但两个对象互不影响。 - `nonatomic`:非线程安全,通常默认。 - `atomic`:线程安全,但会降低性能。 - `autorelease`:将对象放入自动释放池,稍后释放。 - `release`:减少对象的引用计数,可能导致对象被销毁。 - `dealloc`:对象销毁前调用的方法。 3. **`self.name=“yang”`与`name=“yang”`的区别**:`self.name`使用setter方法赋值,可能涉及KVO(Key-Value Observing)和属性的其他逻辑,而`name="yang"`直接修改实例变量,不触发额外的代码。 4. **深拷贝与浅拷贝**:浅拷贝只复制对象本身,不复制其内部的子对象。深拷贝则递归复制对象及其所有子对象,确保新的对象和原始对象相互独立。`mutableCopy`通常用于创建可变副本,但并不总是实现深拷贝,如`NSMutableString`的`mutableCopy`返回的是`NSMutableString`,但`NSArray`的`mutableCopy`返回`NSMutableArray`,需注意具体类型的实现。 5. **`copy`与`mutableCopy`**: - `copy`用于创建不可变副本,如`NSString`到`NSString`,`NSArray`到`NSArray`。 - `mutableCopy`用于创建可变副本,如`NSString`到`NSMutableString`,`NSArray`到`NSMutableArray`。 6. **`#import`与`#include`的区别**: - `#import`:Objective-C中的导入指令,防止头文件重复包含,避免编译错误。 - `#include`:C/C++中的导入指令,通常配合`#ifndef`等宏防止重复包含,但在Objective-C中一般使用`#import`。 7. **Objective-C没有垃圾回收(Garbage Collection, GC)**:与Java或.NET等语言不同,Objective-C依赖于引用计数进行内存管理,而不是自动垃圾回收。开发者需要手动管理对象的生命周期。 了解这些基础知识对于iOS开发初学者至关重要,它们有助于构建良好的编程习惯,避免内存泄漏和其他常见问题。在面试中,这些知识也是考察开发者基本功的重要部分。