2015-04-10 25 views
5

Mã này đã không thay đổi giữa Xcode 6.2 và 6.3, nhưng dòng chứa [self alloc] nay gây ra lỗi:mới trong Xcode 6.3/iOS 8.3: sử dụng tự alloc cho nguyên nhân constructor tiện xây dựng lỗi

Multiple methods named 'initWithType:' found with mismatched result, parameter type or attributes

@implementation AGNetworkDataRequest 

+ (instancetype)networkDataRequestWithType:(AGNetworkDataRequestType)type 
{ 
    AGNetworkDataRequest *r = [[self alloc] initWithType:type];//error here 
    return r; 
} 

- (id)initWithType:(AGNetworkDataRequestType)type 
{ 
    //typical init code 
} 

//... 

Nếu tôi Cmd + nhấp vào cuộc gọi initWithType:, tôi hiển thị xung đột trong CAEmitterBehavior, một đối tượng không được tham chiếu trong dự án của chúng tôi, nhưng tôi đoán là mới trong iOS 8.3.

Nếu tôi thay đổi [self alloc] thành [AGNetworkRequest alloc], các lớp con kế thừa phương thức này sẽ chỉ trả về đối tượng mẹ, hoạt động trái với cách chúng tôi thiết kế lớp này.

Bất kỳ cách nào để loại bỏ xung đột mà không thay đổi tên phương thức (yêu cầu thay đổi tất cả các cuộc gọi phương thức trong suốt ứng dụng)?

+0

Phương thức 'initWithType:' của bạn phải trả về 'instancetype', không phải' id'. Hãy chắc chắn rằng tất cả các phương thức 'init ...' của bạn được khai báo với 'instancetype'. – rmaddy

+0

@rmaddy Apple API dường như tuân theo mẫu 'id' cho' init' và 'instancetype' cho các nhà xây dựng tiện lợi. Bạn có một liên kết đến tài liệu của Apple nói tất cả 'init' phải là 'instancetype'? – ray

+0

Xem tài liệu về bất kỳ phương thức 'init ...' nào và thấy rằng nó trả về 'instancetype'. Ví dụ: 'UITableView initWithFrame: kiểu:' hoặc 'NSArray init'. Tất cả các kiểu trả về 'id' cho các phương thức' init ... 'đã được Apple thay đổi thành' instancetype' trong một số cập nhật iOS gần đây (tôi quên cái nào). – rmaddy

Trả lời

5

truyền lợi tức phân bổ của bạn.

[(AGNetworkDataRequest*)[self alloc] initWithType:type]; 

Điều này sẽ cung cấp cho trình biên dịch đủ thông tin để thực hiện cuộc gọi. Nếu trình biên dịch không biết chiều dài của tham số của bạn thì có khả năng cuộc gọi sẽ thất bại khi chạy (và có thể rất khó gỡ lỗi).

trả về instancetype thay vì id được cho là sửa lỗi này (allocWithZone sẽ tự động trả về instancetype ...) nhưng có thể vì bạn đang sử dụng 'self' không đủ thông tin tĩnh.

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