2015-04-10 14 views
5

Bu kod Xcode 6.2 ve 6.3 arasında değişiklik yoktu, ama şimdi [self alloc] içeren hat hata neden olur:yeni Xcode 6.3/iOS 8.3: kolaylık yapıcı nedenler için kullanarak kendi kendine alloc inşa hata

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 
} 

//... 

Eğer Cmd + initWithType: aramasını tıklatırsam, projemde hiç atıfta bulunulmamış bir nesne olan CAEmitterBehavior çatışmasını gösterdim, ancak iOS 8.3'te yeni olması gerektiğini tahmin ediyorum.

[self alloc] - [AGNetworkRequest alloc]'u değiştirirseniz, bu yöntemi devralan alt sınıflar, yalnızca bu nesneyi nasıl tasarladığımıza karşılık gelen ana nesneyi döndürür.

Yöntem adını değiştirmeden çakışmayı ortadan kaldırmanın herhangi bir yolu (uygulama boyunca tüm yöntem çağrılarını değiştirmeyi gerektirir)? Tahsis iadenizi

+0

'initWithType:' yönteminiz 'id 'değil' instancetype' döndürmelidir. 'Init ... 'yöntemlerinin hepsinin' instancetype' ile bildirildiğinden emin olun. – rmaddy

+0

@rmaddy Apple API'leri, kolaylık sağlayan kurucular için 'in' ve 'instancetype' için 'id' şablonunu izliyor görünmektedir. Apple'ın tüm init 'in instancetype olması gerektiğini belirten bir bağlantınız var mı? – ray

+0

Herhangi bir 'init ... 'yöntemi için dokümanlar bakın ve' instancetype'ı döndürdüğünü görün. Örneğin: "UITableView initWithFrame: style:" veya "NSArray init". Init ... 'yöntemleri için tüm id türlerinin dönüş türleri, bazı iOS güncellemelerinde Apple tarafından" instancetype "olarak değiştirildi (hangisini unuturum). – rmaddy

cevap

5

.

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

Bu, derleyiciye çağrı yapmak için yeterli bilgiyi verecektir. Derleyici, parametrenizin uzunluğunu bilmiyorsa, çağrının çalışma zamanında başarısız olması (ve potansiyel olarak hata ayıklaması çok zor) ihtimali vardır.

ID yerine instancetype döndüren bu düzeltilmesi gerekiyordu (allocWithZone otomatik olarak instancetype döndürecek ...) ancak bunun nedeni 'self' kullandığınız için yeterli statik bilgi yok.

İlgili konular