假设我有一个指定的初始化器,它会进行一些初始化:
- (id)initWithBlah:(NSString *)arg1 otherBlah:(NSArray *)arg2
{
if (self = [super init])
{
...
}
return self;
}
我有另一个需要调用它的初始化程序,但随后执行其他一些设置任务:
- (id)initWithSomeOtherBlah:(void *)creativeArg
{
// Is this right? It seems to compile and run as expected, but feels wrong
self = [self initWithBlah:nil otherBlah:nil];
if (self)
{
[self someProcessingForThisInitDependentOnSelfInit:creativeArg];
}
return self;
}
由于测试确保返回值正确,在这种情况下是否应该使用'self'?我想知道这是否是一个有效的事件组合。我们有一种情况,我们有一个初始化程序,需要在运行指定的初始化程序后执行一些额外的设置。
我想知道正确的方法是将这个额外的处理推到指定的初始化器中。
如果需要进一步澄清,请与我们联系。我试图保持这个简单。 :)
谢谢!
答案 0 :(得分:6)
我遵循的一般经验法则是指定的初始化程序是具有最多参数的初始化程序,而其他初始化程序链接到指定的初始化程序。
在您的示例中,您没有在initWithSomeOtherBlah构造函数中使用creativeArg。我不确定这是否是故意的。
使用这种方法,在创建对象而不是副作用编程时,您明确表达了自己的意图。
例如:
@implementation BlaClass
- (id)initWithBlah:(NSString *)arg1 otherBlah:(NSArray *)arg2 creativeArg:(void *)arg3
{
if (self = [super init])
{
self.arg1 = arg1;
self.arg2 = arg2;
self.arg3 = arg3;
[self someProcessingForThisInitDependentOnSelfInit:arg3];
}
return self;
}
- (void)someProcessingForThisInitDependentOnSelfInit:(void *)creativeArg
{
if(creativeArg == NULL) return;
//do creative stuff
}
- (id)initWithSomeOtherBlah:(void *)arg
{
return [self initWithBlah:nil otherBlah:nil creativeArg:arg];
}
...
@end
答案 1 :(得分:1)
如果你的类中需要两个初始化器,它们稍微有点不同地初始化类,那么一个好的编码实践是识别初始化器需要执行它们的设置任务,并将它们移动到一个单独的方法。这样,您就不需要在另一个内部调用一个自定义初始化程序。以下是您需要执行的操作:
-(void) setupBlah
{.....}
- (id)initWithBlah:(NSString *)arg1 otherBlah:(NSArray *)arg2
{
if (self =[super init])
{
[self setupBlah];
//Do other initialization
....
}
return self;
}
- (id)initWithSomeOtherBlah:(void *)creativeArg
{
if (self = [super init])
{
[self setupBlah];
//Do other initialization
.....
}
return self;
}
答案 2 :(得分:1)
从非指定的初始化程序调用另一个初始化程序没有任何问题,请参阅Apple的文档here。
如果我有两个或更多指定的初始值设定项(例如initWithFrame:
和initWithCoder:
的视图),我发现自己要定义一个setUp
方法两个初始值设定项,只是someProcessingForThisInitDependentOnSelfInit
方法的较短名称。