Objective-c init / initialize方法

时间:2014-03-25 10:08:44

标签: objective-c initialization

我不了解某些情况:

1)

  +(void)initialize {

        if(self == [Bicycle class]) // Make sure it's not executed more than once
        _defaultMark = @"Unbranded product";

   }

我知道这个方法是第一个调用的方法。但我不明白为什么它可以确保不会执行多次?执行一次后,在这种情况下,self总是等于Bicycle类,非?

2)

if(self = [ super init])

有人可以清楚地解释为什么在init或initWithSomething方法中真的有必要这样做吗?

3)HS问题

@protocol StreetLegal <NSObject>

如果我们不使用avec协议名称怎么办?

4 个答案:

答案 0 :(得分:0)

我认为在案例1)self指向Class对象。 在案例中2)self指向实例对象。

+(void)initialize保证每Class只调用一次(Class初始值设定项)。这是由框架/语言确保的。

我认为您发布的initialize位于某个基类中。如果它在基类中,则也为后代类调用initialize。通过这种方式,您可以确保仅对Bicycle类执行if-then。但是......我认为可以实现更好的设计......

编辑:

第2点)。这是必要的,因为您必须显式调用父类的初始值设定项。

第3点)我不明白你的问题......

答案 1 :(得分:0)

1)每个类调用一次这个方法 - 假设你有

@interface Foo : NSObject
@end

@implementation Foo
+ (void) initialize { .... };
@end

@interface Bar : Foo
@end

@implementation Bar
@end

在这种情况下,将在第一次使用Foo时调用相同的方法,并在第一次使用Bar时再次调用它。因此条件if (self == [Foo class])确保只执行一次主体。

2)构造函数可以分配给self ...并且可以返回nil ...所以你应该检查

答案 2 :(得分:0)

你的大多数init方法都是这样的:

if ((self = [super init]) != nil)
{
}

return self;

首先,必须调用超类的init方法,否则您的对象将无法正确初始化。其次,超类可以返回不同的对象,因此你必须将结果分配给self,第三个超类可以返回nil,所以你必须检查它是不是&#39 ;没有。

在您自己的初始化程序中,如果您的init方法发现对象无法正确初始化,您将自己设置为nil并返回nil。

答案 3 :(得分:0)

问题1:

documentation

中得到了很好的回答
  

如果子类没有实现初始化,则可以多次调用超类实现 - 运行时将调用继承的实现 - 或者如果子类显式调用[super initialize]。

例如,如果您在类+initialize中覆盖A,然后在不覆盖B的情况下创建A的子类+initialize,那么方法{ {1}}将为课程+[A initialize]调用一次,为课程A调用一次。类等于检查是为了避免多次调用块。

问题2:

同样,您会在文档中找到大量信息。您想调用B,因为您需要运行超类初始化程序(否则超类结构将无法正确初始化)。分配到[super init]是必要的,因为您并不总是知道将返回的内容。如果出现意外错误,您应该返回self并进行相应检查。

问题3:

您正在声明一个本身继承自其他协议的协议。 nil不仅仅是一个根类,还有一个名为NSObject的根协议。当然,你不必使用它。但是,当您将变量声明为NSObjectid<MyProtocol>不是MyProtocol的子协议时,您将无法在该变量上调用NSObject协议方法