Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 是否始终调用NSObject init?_Objective C_Cocoa - Fatal编程技术网

Objective c 是否始终调用NSObject init?

Objective c 是否始终调用NSObject init?,objective-c,cocoa,Objective C,Cocoa,在Cocoa中,建议始终调用超类的指定初始值设定项。假设在对象的初始化过程中,总是调用init,即使对象不是用init初始化的,这样安全吗 例如,假设有一个类:NSThingie,它可以像[[NSThingie alloc]initWithFoo:foo]或[[NSThingie alloc]initWithFoo:foo和bar:bar]那样初始化。如果我重写init,是否可以假设它将在初始化期间的某个点被调用 编辑 也许我最初的问题措辞不太好。我知道重写init会导致不调用超类中的init

在Cocoa中,建议始终调用超类的指定初始值设定项。假设在对象的初始化过程中,总是调用init,即使对象不是用init初始化的,这样安全吗

例如,假设有一个类:
NSThingie
,它可以像
[[NSThingie alloc]initWithFoo:foo]
[[NSThingie alloc]initWithFoo:foo和bar:bar]
那样初始化。如果我重写init,是否可以假设它将在初始化期间的某个点被调用


编辑

也许我最初的问题措辞不太好。我知道重写init会导致不调用超类中的init,我必须显式调用init。我想知道的是,在apple框架中,是否总是调用
[NSObject init]
。如果我用something:something初始化一些苹果对象,比如
[[NSAppleClass alloc]init
,我能假设NSObject的init最终会在NSAppleClass初始化期间被调用吗

如果我重写init,是否可以假定它将在某个点被调用 在初始化期间

如果重写和
init
方法,则负责调用指定的初始值设定项。开发人员有责任调用子类化类的正确初始值设定项。调用指定的初始值设定项的原因是确保类以其预期状态构造。不调用正确的初始值设定项或根本不调用初始值设定项可能会导致未定义的/不受欢迎的行为。

是的,“init”默认构造函数不执行指定处理
因为NSObject类中定义的init方法不进行初始化;它只返回self。

简短回答:否

您需要确保为正在使用的类重写正确的
init
方法

例如,
UIView
有一个init方法
initWithFrame:
,它的一个非常基本的实现是:

- (id)initWithFrame:(CGRect)frame
{
    self = [super init]; //calls init because UIResponder has no custom init methods
    if (self){
        self.frame = frame;
    }
    return self;
}

init
是在超类上调用的,但不是在
UIView
上调用的,因此如果您要覆盖
init
而不是
initWithFrame:
您的初始化代码将永远不会运行

有关有用信息,请参阅此答案被否决的具体原因?