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

Objective c Obj-,在';自我';未设置为';[(超级或自我)初始化…]';,objective-c,xcode,cocoa-touch,analyzer,Objective C,Xcode,Cocoa Touch,Analyzer,我已经问了一个类似的问题,但我还是看不出问题所在 -(id)initWithKeyPadType: (int)value { [self setKeyPadType:value]; self = [self init]; if( self != nil ) { //self.intKeyPadType = value; } return self; } - (id)init { NSNumberFormatter *f

我已经问了一个类似的问题,但我还是看不出问题所在

-(id)initWithKeyPadType: (int)value
{
    [self setKeyPadType:value];
    self = [self init];
    if( self != nil )
    {
        //self.intKeyPadType = value;

    }
    return self;
}

- (id)init {

    NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] 
                                                              autorelease];
    decimalSymbol = [formatter decimalSeparator];
....

警告来自上面的
实例变量行,而“self”未设置为“[(super或self)init…]”的结果。

警告的意思是它所说的。您正在为
小数符号
赋值,这是一个实例变量,但此时没有实例。你需要一个

self = [super init];

在init方法的开始处。在某些时候必须创建对象,在某些时候必须调用NSObject(通过超级初始化链)

从技术上讲,您尝试执行的操作是正常的,但在某些阶段,您需要调用
[super init]
。如果您的类的
init
方法执行了许多其他
initWith…
方法使用的常见初始化,那么请将您的
[super init]
放入其中。另外,在尝试处理实例变量之前,请始终确保类已初始化

- (id) initWithKeyPadType: (int)value
{
    self = [self init]; // invoke common initialisation
    if( self != nil )
    {
        [self setKeyPadType:value];
    }
    return self;
}

- (id) init
{
    self = [super init]; // invoke NSObject initialisation (or whoever superclass is)
    if (!self) return nil;

    NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] 
                                                          autorelease];
    decimalSymbol = [formatter decimalSeparator];

    ...

如果我正确理解你的代码,你在调用[super init]之前使用了一个变量,这会扰乱你的内存分配。他没有调用super init,说“没有实例”有点强。
alloc
应该已经创建了实例。问题是实例可能没有正确初始化(因为
init
就是这样做的)。您能否进一步说明GCC警告所指出的实际风险?假设对象内存的归零发生在alloc时间(我认为这是正确的),似乎只有@public或@protected ivar才有被超类的
init
方法重击的风险,因此需要发出警告。我想不出为什么警告对私有ivar有用,除了在风格上,但这通常不是编译器关心的问题。@quixoto:+alloc会清空内存。我也不知道为什么这很重要。。。这可能与以下事实有关:调用
[super init]
可能返回
nil
,如果返回,则所有
[sub init]
方法也应返回
nil
。除此之外,我不知道GCC为什么会在意。