2011-11-10 34 views
5

Tôi đã hỏi một câu hỏi tương tự như vậy, nhưng tôi vẫn không thể thấy vấn đề?Obj-, Instance variable được sử dụng trong khi 'self' không được đặt thành kết quả của '[(siêu hoặc self) init ...]'

-(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]; 
.... 

Cảnh báo xuất phát từ dòng trên Instance variable used while 'self' is not set to the result of '[(super or self) init...]'

+1

nếu tôi hiểu đúng mã của bạn, bạn đang sử dụng một biến trước khi gọi [super init] và có thể mess này cấp phát bộ nhớ của bạn –

+0

Anh ấy không gọi siêu init bất cứ nơi nào – jrturton

Trả lời

4

Điều bạn đang cố gắng thực hiện về mặt kỹ thuật là OK, nhưng ở một số giai đoạn bạn cần gọi số [super init]. Nếu phương thức init của lớp học của bạn thực hiện nhiều lần khởi tạo chung mà các phương pháp khác initWith... sử dụng, sau đó đặt [super init] của bạn vào đó. Ngoài ra, luôn đảm bảo rằng lớp học đã được init 'd trước khi thử chơi với các biến mẫu.

- (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]; 

    ... 
+0

Bạn có thể nói thêm về nguy cơ thực tế mà cảnh báo GCC phân phát để chỉ ra không? Giả sử zeroing của bộ nhớ đối tượng xảy ra tại thời gian phân bổ (mà tôi tin là đúng), có vẻ như chỉ có một công cụ @public hoặc @protected ivar sẽ có nguy cơ bị che khuất bởi phương thức 'init' của superclass, cần phải cảnh báo. Tôi không thể nghĩ tại sao cảnh báo sẽ hữu ích cho một cây ngà tư nhân, ngoại trừ phong cách, nhưng đó không phải là mối quan tâm của trình biên dịch. –

+0

@quixoto: + phân bổ không có bộ nhớ ngoài. Tôi cũng không biết tại sao nó lại quan trọng ... Nó có thể liên quan đến thực tế là một lệnh gọi '[super init]' có thể trả về 'nil', và nếu nó thực hiện thì tất cả' [sub init] ' các phương thức cũng nên trả về 'nil'. Khác hơn là tôi sẽ không có một đầu mối tại sao GCC sẽ quan tâm. – dreamlax

2

Cảnh báo có nghĩa là những gì nó nói. Bạn đang chỉ định một cái gì đó cho decimalSymbol, là một biến mẫu, nhưng tại thời điểm đó không có trường hợp nào. Bạn cần một số

self = [super init]; 

Khi bắt đầu phương pháp init của bạn. Tại một số điểm đối tượng đã được tạo ra, tại một số điểm này phải gọi lại cho NSObject (thông qua một chuỗi các siêu inits).

+3

Đó là một chút mạnh mẽ để nói "không có ví dụ. " 'alloc' nên đã tạo ra cá thể. Vấn đề là trường hợp có thể không được khởi tạo chính xác (vì đó là những gì 'init' làm). – Chuck

+0

OK, đúng. Không có "làm việc" dụ? – jrturton

Các vấn đề liên quan