2014-03-25 91 views
0

我不明白有些情况是:的Objective-C初始化/初始化方法

1)

+(void)initialize { 

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

    } 

据我所知,这种方法被称为第一种方法。但我不明白为什么它可以确保不会执行多次?在一次执行之后,在这种情况下,自我总是等于Bicycle类,非?

2)

if(self = [ super init]) 

有人可以解释我说清楚为什么它是真的有必要做在init或initWithSomething方法?

3)HS问题

@protocol StreetLegal <NSObject> 

如果我们不AVEC协议名称使用什么样的?

回答

0

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

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

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

编辑:

2点)。这是必要的,因为你必须显式调用父类的初始化方法。

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

+0

所以真的有必要做if(self == [Bicycle class])? –

+0

我认为你发布的'initialize'是在一些基类中。如果它在基类中,那么也会为后代类调用'initialize'。通过这种方式,你可以确保'if-then'只为'Bicycle'类执行。 – Francesco

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 ...所以你应该检查

0

你的大部分初始方法看起来就像这样:

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

return self; 

首先,你必须调用超类的init方法,否则您的对象将不会被正确初始化。其次,超类可以返回不同的对象,所以你必须把结果赋给自己,第三个超类可以返回nil,所以你必须检查它不是零。

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

0

问题1:

是很好的回答在documentation

超类实现可多次调用,如果子类没有实现初始化,运行时将调用继承的实现,或者,如果子类明确调用[超级初始化]。

例如,如果你重写A+initialize,然后创建一个子类的AB没有覆盖+initialize,那么该方法+[A initialize]将一次A类和一次B类调​​用。类等于检查是为了避免块被多次调用。

问题2:

再次,您会在文档中找到大量信息。您想调用[super init],因为您需要运行超类初始化程序(否则超类结构将无法正确初始化)。 self的分配是必要的,因为你并不总是知道会返回什么。如果发生意外错误,您应该预期返回nil并相应地进行检查。

问题3:

您正在声明一个协议,它本身从另一个协议继承。 NSObject不仅是一个根类,还有一个根协议叫NSObject。当然,你不必使用它。但是,如果您然后声明变量为id<MyProtocol>而没有MyProtocolNSObject的子协议,则您将无法在该变量上调用NSObject协议方法。