面试题答案
一键面试- alloc/new/copy/mutableCopy创建对象
- 引用计数变化:新创建的对象引用计数为1。例如,使用
NSObject *obj = [[NSObject alloc] init];
,obj
的引用计数初始为1。 - 对内存释放影响:只有当该对象的引用计数减为0时,才会释放其所占用的内存。在此之前,对象一直存在于内存中。
- 引用计数变化:新创建的对象引用计数为1。例如,使用
- retain方法
- 引用计数变化:调用
retain
方法会使对象的引用计数加1。比如[obj retain];
,obj
的引用计数从当前值加1。 - 对内存释放影响:增加了对象的持有方,只有当所有持有方都释放(引用计数相应减少),使得引用计数变为0时,对象才会被释放。
- 引用计数变化:调用
- release方法
- 引用计数变化:调用
release
方法会使对象的引用计数减1。如[obj release];
,obj
的引用计数从当前值减1。 - 对内存释放影响:如果减1后引用计数变为0,对象所占用的内存会被释放,相关资源也会被回收。
- 引用计数变化:调用
- autorelease方法
- 引用计数变化:调用
autorelease
方法时,对象的引用计数不会立即改变,而是被添加到自动释放池(Autorelease Pool)中。当自动释放池被销毁时,池中的对象会收到release
消息,引用计数减1。例如NSObject *obj = [[[NSObject alloc] init] autorelease];
,在自动释放池销毁前,obj
引用计数不变,自动释放池销毁时,obj
引用计数减1。 - 对内存释放影响:如果自动释放池销毁时,对象引用计数减为0,对象内存被释放。若在自动释放池销毁前对象引用计数已通过其他方式变为0,对象也会提前释放。
- 引用计数变化:调用
- 对象作为函数返回值
- 引用计数变化:当一个对象作为函数返回值返回时,调用者接收该对象,引用计数规则遵循创建对象的规则(如通过
alloc
创建返回,引用计数为1)。例如:
这里- (NSObject *)createObject { return [[NSObject alloc] init]; } NSObject *newObj = [self createObject];
newObj
引用计数为1。- 对内存释放影响:调用者负责管理该对象的引用计数,通过
release
或autorelease
等操作来控制对象的生命周期,当引用计数为0时对象内存被释放。
- 引用计数变化:当一个对象作为函数返回值返回时,调用者接收该对象,引用计数规则遵循创建对象的规则(如通过
- 属性声明为retain(ARC之前)
- 引用计数变化:在ARC之前,如果属性声明为
retain
,当给该属性赋值时,会对新值调用retain
方法使其引用计数加1,对旧值调用release
方法使其引用计数减1。例如:
@property (nonatomic, retain) NSObject *myObj; - (void)setMyObj:(NSObject *)newObj { if (_myObj != newObj) { [_myObj release]; _myObj = [newObj retain]; } }
- 对内存释放影响:正确管理了新旧值的引用计数,确保旧值在不再被使用时能被正确释放,新值被正确持有,避免内存泄漏和悬空指针等问题。当最终对象的引用计数为0时,内存被释放。
- 引用计数变化:在ARC之前,如果属性声明为