Proč musím odevzdat vlastní, aby id?

hlasů
5

Mám metodu init, který bere argument (ID):


    -(id) initWithObject:(id) obj;

Snažím se to nazvat takhle:


    [[MyClass alloc] initWithObject:self];

Ale XCode stěžuje argument být „odlišný typ Objective-C“ (což obvykle indikuje Neshoda typu nebo míru chyb indirection).

Mám-li výslovně házet sebe na (ID) varování zmizí. V každém případě, že kód spustí očekávaným způsobem. Je zajímavé, že na dalším řádku jsem průchodem já na jinou metodou, která využívá i id, a to funguje dobře.

Zajímalo by mě, jestli jsem něco chybí jemné - nebo je to zvláštnost kompilátor?

Nejsem si úplně pohodlné prostě lití, dokud jsem si jistý, že z důvodů, proč je to nutné.

[Upravit]

Byl jsem požádán, aby dodávat více kódu. Není si jistý, že to nic jiného, že je to důležité. Tady je můj skutečný kód, který umožňuje volání. Všimněte si, že je sám, v rámci metody init. Je to volání initWithSource, které je dát varování:


-(id) initWithFrame:(CGRect) frame
{
    self = [super initWithFrame: frame];
    if( self )
    {
        delegate = nil;
        touchDelegate = [[TBCTouchDelegate alloc] initWithSource:self];
        [touchDelegate.viewWasTappedEvent addTarget: self action:@selector(viewWasTapped:)];
    }
    return self;
}

A tady je metoda init volána:


-(id) initWithSource:(id) sourceObject
{
    self = [super init];
    if (self != nil) 
    {
        // Uninteresting initialisation snipped
    }
    return self;
}
Položena 23/11/2008 v 16:17
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
7

Obvykle to znamená, že je více initWithSource:názvy metod na různých třídách s konfliktní typy argumentů. Nezapomeňte, že pokud je proměnná zadána jako idpřekladač neví, co to je třída. Pokud tedy budete volat initWithSource:na id-typed objekt a několik tříd mají initWithSource:metodu, překladač v podstatě jen vybere jeden z těchto dvou. Kdyby to zvedne „špatné“ one, no, dostanete chybu „odlišný typ Objective-C“.

Tak proč se to děje s vámi? Nejsem si 100% jistý, ale pamatujte, že +[TBCTouchDelegate alloc]vrací id. Tak řetězení alloc / init volá je ekvivalentní k tomu:

id o = [TBCTouchDelegate alloc];
touchDelegate = [o initWithSource:self];

Z tohoto důvodu, voláte initWithSource:na id-typed proměnné. Pokud existuje konfliktní initWithSource:způsob, mohli byste dostat tuto chybu kompilátoru.

Existuje konfliktní způsob? Ověřil jsem si systém, a jediný konfliktní jeden byl v NSAppleScript:

- (id)initWithSource:(NSString *)source;

Nyní NSAppleScript je součástí nadace, ale všiml jsem si, je to iPhone code. Tak snad si jen dostat tuto chybu při kompilaci na simulátoru, a to zařízení?

V každém případě, pokud je to váš problém, mohli byste dostat kolem ní štípací alloc / init na dvou různých tratích:

touchDelegate = [TBCTouchDelegate alloc];
touchDelegate = [touchDelegate initWithSource:self];

Nyní, voláte initWithSource:na plně zadali proměnné (namísto id-typed), takže kompilátor již nemá hádat, který z nich vybrat. Nebo byste mohli obsazení návrat od +alloc:

touchDelegate = [(TBCTouchDelegate *)[TBCTouchDelegate alloc] initWithSource:self];

Dalším řešením je přejmenování initWithSource:, aby se zabránilo konfliktům a snad aby bylo výstižnější. Neříkejte, co třída je v současné době s názvem ani co je „zdroj“ je určen, takže nemohu vyhodit nějaké možnosti.

Odpovězeno 23/11/2008 v 20:51
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more