我一直在为我的对象创建自定义初始值设定项,因为它比其他方式设置变量感觉更好。在这些初始化器中,我通常设置对象的变量,然后返回对主init的调用。
因此,例如,在UIViewController子类中,我的代码看起来像这样:
-(id)initWithValue:(int)val {
self.value = val;
return [self initWithNibName:nil bundle:nil];
}
其中value
是属于该ViewController子类的整数,并且通常有更多的值。
然而,最近我开始设置自我,因为我认为self = [self init...]
将替换该类的当前实例,因此我将失去自我的实例。
所以,我已经开始做了:
-(id)initWithValue:(int)val {
self = [self initWithNibName:nil bundle:nil];
self.value = val;
return self;
}
我最近检查了原始版本并意识到一切正常并且更改是不必要的。
所以,我的问题是:
先谢谢!
答案 0 :(得分:2)
您应该按照以下方式进行:
- (id)initWithValue:(int)val {
self = [super initWithNibName:nil bundle:nil];
if (self) {
_value = val;
}
return self;
}
在iOS中,如果发送到init方法的参数无效,则常见的模式是返回nil。该值将是两件事之一:当前指向self或nil的指针。如果对super的调用返回nil,那么对象设置不正确,所以你也应该返回nil。做self = [super initWithNibName:nil bundle:nil];只是让人更容易尊重super
返回的可能的nil值答案 1 :(得分:1)
请使用以下代码覆盖init方法
-(id)initWithValue:(int)val
{
self = [super init];
if(self)
{
self.value = val;
}
return self;
}
答案 2 :(得分:0)
您编写的第一个代码不会存储value
,因为在创建对象之前,您尝试存储数据。
但是,第二个代码需要对更好的实践进行一些小修改,就像这样......
-(id)initWithValue:(int)val {
self = [self initWithNibName:nil bundle:nil];
if(self)
_value = val;
return self;
}
希望这对你有用......: - )
答案 3 :(得分:0)
[super initWithNibName:bundle:]实际上调用了超类的方法。 如果你使用[self initWithNibName:bundle:]实际上它会调用initWithNibName:bundle的重写:当然你必须重写它,否则它也会调用超类方法。所以如果你想在initWithNibName的重写中做一些初始化,那么你可以使用[self initWithNibName:bundle:]但是如果你不需要做额外的初始化,那么to方法之间没有区别;