对于仅用于单一类的非初始化方法名称中使用'init'有什么影响

And*_*nov 2 singleton objective-c ios automatic-ref-counting ios6

所以我的理解是,如果该方法没有实现初始化对象的新实例,那么在方法名称中使用init是不可取的.但是,单例类型的情况是什么?如果我做这样的事情:

+ (MyClass*) sharedInstance {

    __block MyClass *sharedInstance = nil;
    static dispatch_once_t once_token;
    dispatch_once(&once_token, ^{
        sharedInstance = [[MyClass alloc] init];
    });

    return sharedInstance;
}
Run Code Online (Sandbox Code Playgroud)

然后有另一种方法:

- (void) initializeInstance {
  // Do some stuff
  // Never call the init method
}
Run Code Online (Sandbox Code Playgroud)

如果我这样做,是否会有额外的保留周期或其他奇怪的ARC行为?

Lil*_*ard 5

该方法-initializeInstance不是问题.这不属于该init系列,因此编译器不会特别对待它.根据文件,为了被归类为init家庭,它必须符合以下规则:

  1. 选择器的第一个组件必须是init,或者必须init以小写字母以外的任何字符开头.initializeInstance不符合这个规则.
  2. 此外,该init方法必须返回一个Obj-C对象.initializeInstance也不符合这个规则.我相信如果违反此规则会导致编译时错误,而不是简单地不将该方法视为init.