我试图覆盖类的init
方法,以便初始化对象也初始化ivar对象:
-(id)init
{
if (self = [super init])
{
someIVarObject = [SomeClass alloc] init];
}
return self;
}
1)这个代码是否会起作用,即便如此,这个解决方案是否会被劝阻?
2)为什么if
条件不是==
?这是一项任务吗?如果是,为什么if
?
对不起,如果这很明显! > _<
答案 0 :(得分:3)
是的,它会起作用,并且它仍然是它应该完成的方式。
它的作用是呼叫[super init]
并允许它做三件事之一;
self
已设置为。nil
。然后将结果分配给self
,这样可以确保构造函数的其余部分在更改时对正确的对象进行操作。 if
用于捕获[super init]
返回nil的情况,在这种情况下应该跳过构造函数的其余部分。
答案 1 :(得分:2)
1)在这里,您要声明一个局部变量someIVarObject
。您应该在花括号中的类的接口或实现中声明它,然后应将其指定为someIvarObject = ...
。一个例子:
@implementation MyClass {
SomeClass *someIvarObject;
}
- (id)init
{
if(self = [super init])
{
someIvarObject = [[SomeClass alloc] init];
}
return self;
}
@end
2)这是一项任务。这个成语背后有着悠久的历史,但它主要归结为处理[super init]
返回与最初调用的init
不同的对象的可能性。
答案 2 :(得分:2)
此...
if(self = [super init])
会起作用,但它会给你一个编译器警告(除非你已经关闭了这个警告)。
您还可以使用双括号来抑制警告:
if((self = [super init]))
我目前的偏好:
self = [super init];
if(self)
答案 3 :(得分:2)
你有一些拼写错误,不平衡的括号,你说的东西是一个ivar不是一个ivar(你在if
内声明它,这使得它的范围是该块的本地。你想放{}
或@implementation
声明后@interface
中的实例变量。但是,是的,这通常是如何工作的。
但是,我会仔细研究你是否真的需要伊娃。我不记得上次我在代码中使用过一次了。我曾经使用它的99%的情况,@property
现在是一个更好的解决方案。
作为额外的好处,@property
合成了他们自己的getter和setter,(通常)不需要编写手动alloc
样板文件,从而使这个问题没有实际意义。
答案 4 :(得分:1)
1)此代码可以使用但是这一行:
SomeClass *someIVarObject = [SomeClass alloc] init];
有点意义。在.h文件中声明SomeClass *someIVarObject
并在init中初始化它,如下所示:
someIVarObject = [SomeClass alloc] init];
2)此行if (self = [super init])
相当于:
self = [super init]; if (self != nil)
即。它确保基类的init方法返回了正确的值