覆盖init方法为实例变量对象分配内存

时间:2013-02-11 20:12:08

标签: objective-c initialization override alloc ivar

我试图覆盖类的init方法,以便初始化对象也初始化ivar对象:

-(id)init 
  {
    if (self = [super init])
    {
       someIVarObject = [SomeClass alloc] init];
    }
    return self;
  }

1)这个代码是否会起作用,即便如此,这个解决方案是否会被劝阻? 2)为什么if条件不是==?这是一项任务吗?如果是,为什么if

对不起,如果这很明显! > _<

5 个答案:

答案 0 :(得分:3)

是的,它会起作用,并且它仍然是它应该完成的方式。

它的作用是呼叫[super init]并允许它做三件事之一;

  • 返回self(即同一个对象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方法返回了正确的值