当实例调用其 -dealloc 方法时?
When an instance has its -dealloc method called?
我有一个 class 实例,它具有很强的 属性 SomeClass
,它仅被此单个实例引用。在某些时候,这个强 属性 被分配给这个强 属性 的新创建的实例覆盖。
@implementation SomeClass
- (instancetype)init;
{
static NSInteger idx = 0;
NSLog(@"I am %", idx++);
self = [super init];
return self;
}
- (oneway void)dealloc;
{
NSLog("bye");
}
@end
然后,在class持有参考:
@property (nonatomic, strong) SomeClass *prop;
...然后
self.prop = [[SomeClass alloc] init]; /// first time assigned
...然后
self.prop = [[SomeClass alloc] init]; /// second time assigned
通常情况下,顺序是:
- 新实例被分配(调用其自定义 -init*)
- 旧实例被释放(调用其自定义-dealloc)
输出如下:
I am 0
I am 1
bye
但是,有没有可能顺序颠倒了?
有没有可能得到这样的输出?:
I am 0
bye
I am 1
例如,如果 SomeClass -init
方法执行一些 CPU 繁重的任务,但仍在同一个/主线程中?
在行
self.prop = [[SomeClass alloc] init];
等号右边的内容发生在实际赋值之前。在分配之前不存在释放现有对象的问题。因此,“I am ...”将在存在任何释放现有对象的问题之前打印出来。
我有一个 class 实例,它具有很强的 属性 SomeClass
,它仅被此单个实例引用。在某些时候,这个强 属性 被分配给这个强 属性 的新创建的实例覆盖。
@implementation SomeClass
- (instancetype)init;
{
static NSInteger idx = 0;
NSLog(@"I am %", idx++);
self = [super init];
return self;
}
- (oneway void)dealloc;
{
NSLog("bye");
}
@end
然后,在class持有参考:
@property (nonatomic, strong) SomeClass *prop;
...然后
self.prop = [[SomeClass alloc] init]; /// first time assigned
...然后
self.prop = [[SomeClass alloc] init]; /// second time assigned
通常情况下,顺序是:
- 新实例被分配(调用其自定义 -init*)
- 旧实例被释放(调用其自定义-dealloc)
输出如下:
I am 0
I am 1
bye
但是,有没有可能顺序颠倒了?
有没有可能得到这样的输出?:
I am 0
bye
I am 1
例如,如果 SomeClass -init
方法执行一些 CPU 繁重的任务,但仍在同一个/主线程中?
在行
self.prop = [[SomeClass alloc] init];
等号右边的内容发生在实际赋值之前。在分配之前不存在释放现有对象的问题。因此,“I am ...”将在存在任何释放现有对象的问题之前打印出来。