面试题答案
一键面试ARC环境下
- 差异:ARC自动管理对象的内存释放,开发者无需手动调用
retain
、release
和autorelease
。在单例模式实现中,不用担心内存管理的手动操作。 - 优化:使用
dispatch_once
确保单例只被创建一次,并且由于ARC自动管理内存,单例对象在其生命周期结束时会自动释放。 - 关键代码片段:
#import <Foundation/Foundation.h>
@interface Singleton : NSObject
@property (nonatomic, strong, class) Singleton *sharedInstance;
@end
@implementation Singleton
+ (Singleton *)sharedInstance {
static Singleton *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
@end
MRC环境下
- 差异:需要手动管理对象的引用计数,在单例模式实现中,要正确处理
retain
、release
和autorelease
,防止内存泄漏和过度释放。 - 优化:同样使用
dispatch_once
确保单例只创建一次,同时在retain
、release
和autorelease
方法中进行适当处理,保证单例对象的生命周期正确管理。 - 关键代码片段:
#import <Foundation/Foundation.h>
@interface Singleton : NSObject
@property (nonatomic, retain, class) Singleton *sharedInstance;
@end
@implementation Singleton
static Singleton *sharedInstance = nil;
+ (Singleton *)sharedInstance {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
- (id)retain {
return self;
}
- (NSUInteger)retainCount {
return NSUIntegerMax;
}
- (oneway void)release {
// 不做任何操作,单例对象不应该被释放
}
- (id)autorelease {
return self;
}
@end
总结
ARC环境下实现单例模式更简洁,因为内存管理由系统自动完成。MRC环境下需要开发者手动处理引用计数,以确保单例对象的正确生命周期管理。两种环境下都使用dispatch_once
来保证单例的唯一性。