【问题标题】:When an instance has its -dealloc method called?当一个实例调用它的 -dealloc 方法时?
【发布时间】:2019-04-26 15:43:32
【问题描述】:

我有一个具有强属性SomeClass 的类实例,它只被这个单个实例引用。在某些时候,这个强属性会被一个新创建的实例覆盖,该实例分配给这个强属性。

@implementation SomeClass

- (instancetype)init;
{
     static NSInteger idx = 0;
     NSLog(@"I am %", idx++);

     self = [super init];
     return self;
}


- (oneway void)dealloc;
{
   NSLog("bye"); 
}
@end

那么,在类中持有引用:

@property (nonatomic, strong) SomeClass *prop;

...然后

self.prop = [[SomeClass alloc] init];   /// first time assigned

...然后

self.prop = [[SomeClass alloc] init];   /// second time assigned

通常,顺序是:

  • 新实例被分配(调用它的自定义 -init*)
  • OLD 实例被释放(调用其自定义 -dealloc)

输出如下:

 I am 0
 I am 1
 bye

但是,有没有可能顺序颠倒?

有没有可能得到这样的输出?:

 I am 0
 bye
 I am 1

例如,如果SomeClass -init方法执行了一些CPU繁重的任务,但仍然在同一个/主线程中?

【问题讨论】:

    标签: objective-c automatic-ref-counting


    【解决方案1】:

    排队

    self.prop = [[SomeClass alloc] init];
    

    等号右边的内容发生在实际赋值之前。在分配之前不存在释放现有对象的问题。因此,“I am ...”将在释放现有对象的任何问题之前打印。

    【讨论】:

    • self.prop = nil; 会释放现有对象吗?
    • 最终,是的,如果没有其他保留它的话。但它不需要立即发生。
    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 2014-11-28
    • 1970-01-01
    相关资源
    最近更新 更多