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)?
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
@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
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