2014-06-27 13 views
18

Tôi đang cố gắng chuyển đổi mã của tôi cho dự án iOS 8, và tôi cần một số lời giải thích về cách sửa chữa cảnh báo này: "Convenience initializer missing a 'self' call to another initializer""Convenience initializer thiếu 'tự' cuộc gọi đến khác initializer"

trên mã này:

-(instancetype) initWithCoder:(NSCoder *)aDecoder // warning: Convenience initializer missing a 'self ' call to another initializer 
{ 
    if (self = [super initWithCoder:aDecoder]) // warning: convenience initializer should not invoke an initializer on 'super' 
    { 
    // some init stuff here 
    } 
    return self; 
} 
+1

từ lớp nào lớp này được kế thừa? –

+0

được thừa hưởng từ Uiview – ignotusverum

+1

Và đó là hành vi IMO tốt để chuyển bài tập này ra khỏi câu lệnh if. –

Trả lời

31

Vận chuyển Clang mới bằng Xcode 6 cho phép khởi tạo được chỉ định do trình biên dịch thông qua macro NS_DESIGNATED_INITIALIZER. Khi nó đánh dấu bất kỳ một trong các phương thức init-family trong khai báo của lớp, tất cả các trình khởi tạo khác được coi là khởi tạo "phụ" (sử dụng thuật ngữ của Apple). Đó là, họ nên gọi thông qua một bộ khởi tạo được chỉ định hoặc phụ khác cho đến khi chúng đạt đến một bộ khởi tạo được chỉ định.

UIView không đánh dấu gì là trình khởi tạo được chỉ định, vì vậy một nơi nào đó bạn đã khai báo một phương thức init khác của lớp làm trình khởi tạo được chỉ định. Do đó, trình khởi tạo của NSCoder sẽ được đánh dấu là thứ cấp và tạo ra một cảnh báo. Tôi đã gửi một radar (rdar: // 17559176) về nó, nhưng cho đến khi nó có thể được tắt trên cơ sở từng tệp bằng cách chỉ định -Wno-objc-designated-initializers hoặc bằng cách cung cấp push-pop chẩn đoán thích hợp với -Wobjc-designated-initializers.

+2

Ít nhất là iOS SDK 9.2, cả UIView's -initWithFrame: và -initWithCoder: đều được đánh dấu NS_DESIGNATED_INITIALIZER. – bleater

3

Chỉ cần một phụ lục với những gì @CodaFi đang nói:

  • Một lát docs Apple I được tìm thấy trên initializers định là here.
  • Tôi đã trả lời câu hỏi về cách loại bỏ những cảnh báo này here, với một vài tùy chọn khác. Tôi đặc biệt thích phương pháp tiêu đề biên dịch sẵn (# 2), bởi vì nó nhắc bạn sửa chữa nó.
Các vấn đề liên quan