我不了解某些情况:
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协议名称怎么办?
答案 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:
中得到了很好的回答如果子类没有实现初始化,则可以多次调用超类实现 - 运行时将调用继承的实现 - 或者如果子类显式调用[super initialize]。
例如,如果您在类+initialize
中覆盖A
,然后在不覆盖B
的情况下创建A
的子类+initialize
,那么方法{ {1}}将为课程+[A initialize]
调用一次,为课程A
调用一次。类等于检查是为了避免多次调用块。
问题2:
同样,您会在文档中找到大量信息。您想调用B
,因为您需要运行超类初始化程序(否则超类结构将无法正确初始化)。分配到[super init]
是必要的,因为您并不总是知道将返回的内容。如果出现意外错误,您应该返回self
并进行相应检查。
问题3:
您正在声明一个本身继承自其他协议的协议。 nil
不仅仅是一个根类,还有一个名为NSObject的根协议。当然,你不必使用它。但是,当您将变量声明为NSObject
且id<MyProtocol>
不是MyProtocol
的子协议时,您将无法在该变量上调用NSObject
协议方法