我在我的项目中使用ARC
我有 1 节课是这样的:
@implementation MyObject
+ (instancetype)shareInstance {
static id _shareInstance = nil;
static dispatch_once_t oncePredicate;
dispatch_once(&oncePredicate, ^{
_shareInstance = [[self alloc] init];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(freeInstance)
name:kLC_Notification_FreeAllInstance object:nil];
});
return _shareInstance;
}
+ (void)freeInstance {
/*I want to release object "_shareInstance" but how??? */
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
@end
但是我不能释放我的实例对象,所以我必须改变:
(将代码行 static id _shareInstance = nil;
移出+shareInstance
@implementation MyObject
static id _shareInstance = nil;
+ (instancetype)shareInstance {
static dispatch_once_t oncePredicate;
dispatch_once(&oncePredicate, ^{
_shareInstance = [[self alloc] init];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(freeInstance)
name:kLC_Notification_FreeAllInstance object:nil];
});
return _shareInstance;
}
+ (void)freeInstance {
_shareInstance = nil;
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
@end
当我使用名称推送通知时:kLC_Notification_FreeAllInstance,所有实例对象都被释放(所有 dealloc 方法都被调用)。没关系
但是当我再次调用它时......
所有实例都不会在下次调用时初始化。之后所有实例对象都将为零
我在块中做了很多断点,dispatch_once
没有调用断点。
所以我的问题是:
用方法写
static id object;
和用方法写,有区别吗?如何释放所有实例对象以便我仍然可以再次调用它们?(我想使用 ARC,我可以在没有 ARC 的情况下做到这一点)