2010-12-06 17 views
0

Ich habe ein NSSet-Objekt, das ich in einem performSelector -Aufruf übergeben möchten:perform nicht Gegenstand an den Wähler passieren

NSSet *myNSSetObject = [self getSet]; 

if (myNSSetObject.count != 1) 
    return; 

[self performSelector:@selector(myMethod:) withObject:myNSSetObject afterDelay:0.5]; 

Problem ist, dass das Objekt in myMethod leer ankommt. Da performSelector das übergebene Objekt beibehält, verstehe ich nicht, was falsch läuft.

Meine Methode ist wie folgt definiert

- (void)myMethod:(NSSet *)myNSSetParam { 
    NSLog(@"Set count: %d", myNSSetParam.count); 
    [do sth]; 
} 

Die NSLog zeigt: Set Zahl: 0


Blick tiefer in die Materie und bereits durch die oben Zählung vorgeschlagen, das NSSet Objekt tatsächlich bestanden, aber verliert seine Aufzeichnung (en).

Ist es nicht so, dass ein NSSet seine Objekte behält?

Antwort

1

Sind Sie sicher, dass getSet eine tatsächliche NSSet und nicht veränderbare Unterklasse zurück ” unter ein NSSet “ Basiszeigern versteckt? Wenn es veränderbar ist, ist es möglich, dass der Satz innerhalb der Verzögerung von 0,5 Sekunden modifiziert wird. Auch wenn performSelector:withObject:afterDelay: das Set behält, verhindert es nicht, dass es geändert wird.

2

Geht myMethod tatsächlich ein Argument? Es ist wichtig zu beachten, dass Methodennamen und Selektoren in Objective-C tatsächlich die Doppelpunkte enthalten, die in der Deklaration vorhanden sind. daher ein Verfahren wie folgt aus:

- (void)myMethod:(NSSet *)set; 

muss mit @selector(myMethod:), einschließlich des nachgestellten Doppelpunkt referenziert werden.

+0

Ja, tut es. Ich habe die Frage aktualisiert, um den Anruf anzuzeigen, danke. – iFloh

0

Sie sollten

[self performSelector:@selector(myMethod:) withObject:myNSSetObject afterDelay:0.5]; 

statt (man beachte den Doppelpunkt hinter dem Nachrichtenname) nennen.

+0

gleich wie oben, war ein Tippfehler (aktualisiert), danke – iFloh

0

Meinen Sie

[self performSelector:@selector(myMethod:) withObject:myNSSetObject afterDelay:0.5] 

myMethod: Unter der Annahme, eine Methode, die ein Objekt nimmt?

+0

Ja, ich habe ... Tippfehler, nur aktualisiert ... danke – iFloh

2

Nach der Rückkehr von der ersten Nachricht (oder teilweise unter dem veröffentlichten Code-Snip), ändern Sie versehentlich die NSSet von [self getSet] geliefert? Wenn Sie danach Objekte aus dem Set entfernen, kann myMethod: nicht mehr darauf zugreifen.