Objective c Obj-C,在';自我';未设置为';[(超级或自我)初始化…]';

Objective c Obj-C,在';自我';未设置为';[(超级或自我)初始化…]';,objective-c,xcode,cocoa-touch,analyzer,Objective C,Xcode,Cocoa Touch,Analyzer,我知道不久前我问了一个类似的问题,但我还是有点不确定。同样的事情发生在好几个地方 “self”未设置为“[(super或self)init…]”的结果时使用的实例变量 A B C 对于A区,这是正确的吗 self = [self init]; if( self != nil ) { 和B&C - (id) initWithFrame:(CGRect)frame { super = [super initWithFrame:frame] if(super != nil) {

我知道不久前我问了一个类似的问题,但我还是有点不确定。同样的事情发生在好几个地方

“self”未设置为“[(super或self)init…]”的结果时使用的实例变量

A

B

C

对于A区,这是正确的吗

self = [self init]; 
if( self != nil )
{
和B&C

- (id) initWithFrame:(CGRect)frame {
   super = [super initWithFrame:frame]
    if(super != nil)
   {

一般来说,你应该写:

self = [super init...];  // Potentially change "self"
if (self) {
    something = x;
    another = y;
}
return self;

这是因为在某些情况下,
init
可能不会返回原始的
self
值。

这是一个问题吗?如果是这样的话,问题是什么?如果你写了子类,请使用SuperThank,因为你的答案清晰而没有技术性。。。为什么
self=[super
而不是
self=[self
?如果您要调用的
init…
版本最终执行了
[super init…]
调用,您可以使用
self=[self
,在某些情况下可能需要这样做。(事实上,如果您的
init
在库类的某个类别中,这几乎是强制性的。)但是您需要确保
super
版本最终会被调用,否则您的对象将不完整。
self = [self init]; 
if( self != nil )
{
- (id) initWithFrame:(CGRect)frame {
   super = [super initWithFrame:frame]
    if(super != nil)
   {
self = [super init...];  // Potentially change "self"
if (self) {
    something = x;
    another = y;
}
return self;