【发布时间】:2013-01-11 21:35:48
【问题描述】:
问题:我看到在设置为 nil 后在静态对象上调用 dealloc 方法的顺序中出现了一些奇怪的行为。
为了说明问题,我取了一个类名BBSampleClass,它有两个方法
interface BBSampleClass : NSObject
+ (BBDummyObject*)getInstance;
+ (void)cleanUp;
@end
static BBSampleClass *sInstance = nil;
@implementation BBSampleClass
+ (void)initialize
{
sInstance = [[BBDummyObject alloc] init];
}
+ (BBDummyObject*)getInstance
{
return sInstance;
}
+ (void)cleanUp
{
sInstance = nil;
}
- (void)dealloc
{
NSLog(@"BBSampleClass Object Dealloc");
}
@end
在我的应用程序的某个时刻,如果我在 BBSampleClass 中调用类方法 cleanUp,(它会设置静态实例变量 sInstance 到 nil),人们会期望它的 dealloc 在执行其他语句之前立即被调用,因为此时没有其他对象拥有 sInstance。
即执行这两条语句
[BBSampleClass cleanUp]
NSLog(@"After Cleanup");
应该输出到控制台,这是正确的。
**2013-01-11 14:14:32.280 BBSampleCode[7781:c07] BBSampleClass Object Dealloc
2013-01-11 14:14:32.280 BBSampleCode[7781:c07] 清理后**
但是,如果我尝试通过它的 getInstance 类方法检索 BBSampleClass 的对象,像这样
[BBSampleClass getInstance];//do something with object
[BBSampleClass cleanUp];
NSLog(@"After Cleanup");
NSLog语句的执行顺序颠倒了,即BBSampleClass的静态对象在执行完NSLog(@"After Cleanup")语句后被释放,这是错误的。
**2013-01-11 14:15:43.940 BBWebView[7811:c07] After Cleanup
2013-01-11 14:15:43.940 BBWebView[7811:c07] BBSampleClass Object Dealloc**
编辑:解决方案
将 [BBSampleClass getInstance] 移动到 @autoreleasepool { } 块中可以解决问题。
【问题讨论】:
-
很难理解您的问题是什么。你能用正确的术语、完整的综合英语句子和一个实际编译的最小代码示例来改写它吗?
-
scenario2 和 output2 有什么遗漏吗?
标签: objective-c memory-management automatic-ref-counting