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为什么会在意。