我想知道[[alloc] init]这只是一个约定,还是分开两个调用有更广泛的用途.例如,我想知道人们是否曾[init]在现有对象上调用(或朋友)来"重新初始化"它.
惯例是永远不要重新初始化对象.您可以在非常有限的基础上在NSObject子类(或定义新根)的类中进行,但是您不应该使用系统框架中任何其他类的子类来执行此操作.
如果要"重用"类的实例,则提供在指定的初始化程序之外重用的方法.即你能做到:
- (void) reset;
Run Code Online (Sandbox Code Playgroud)
要么:
- (void) resetWithNewState: (MyState *) aState;
Run Code Online (Sandbox Code Playgroud)
按照惯例,init系列的唯一用途是它们互相调用时.例如:
-(id) initWithSomething:(int)something {
self = [super init];
// use something
return self;
}
-(id) init {
return [self initWithSomething:3];
}
Run Code Online (Sandbox Code Playgroud)
你可能会传递一个从未被调用过init的僵尸对象,但我想不出这样做的好理由.如果要在不知道类型的情况下创建对象,可以传递一个类.
-(id) makeAnything:(Class)someClass {
return [[someClass alloc] init];
}
Run Code Online (Sandbox Code Playgroud)
编辑:
alloc保证所有成员都初始化为零,并且许多init方法依赖于此.init不止一次打电话打破了这份合同.
| 归档时间: |
|
| 查看次数: |
756 次 |
| 最近记录: |