2015-10-30 2 views
1

Je le code suivant:causes performSelector fuite, car le type ne va pas dans l'objectif c

SEL moveAlongBoth = @selector(moveAlongX:andY:); 
if ([p1 respondsToSelector:moveAlongBoth]) { 
    [p1 performSelector: moveAlongBoth 
      withObject: [NSNumber numberWithInt:1] 
      withObject: [NSNumber numberWithInt:1]]; 
} 

Je reçois un avertissement « performSelector peut provoquer une fuite ». Mais

[p1 moveAlongX:1 andY:1]; 

Fonctionne très bien.

Je comprends que j'obtiens l'erreur car les valeurs sont définies sur (int) dans l'implémentation et j'utilise NSNumber. Sans changer l'implémentation, comment pourrais-je déclarer une valeur numérique à int (si possible)?

+0

Est-ce une erreur ou un avertissement? –

+0

Désolé, avertissement. Mais le résultat est incorrect. –

+0

Eh bien, alors jetez un oeil au résultat. C'est un avertissement car ARC ne peut pas "voir" au-delà de performSelector. –

Répondre

1

Pourquoi ne pouvez-vous faire ceci:

if ([p1 respondsToSelector:@selector(moveAlongX:andY:)]) { 
    [(id)p1 moveAlongX:1 andY:1]; 
} 

Par ailleurs, le Cocoa naming convention aurait vous appelez cette méthode moveAlongX:y:.

+0

Merci! Les instructions voulaient que nous utilisions respondsToSelector et pour une raison quelconque, je n'ai même pas pensé à le faire de cette façon! –

0

En ce qui concerne la deuxième partie. Si vous êtes en charge des classes qui peuvent être du type p1, vous pouvez définir un avec moveAlongBoth:: et au lieu de vérifier avec performSelector vérifier avec conformsToProtocol. Disons que le nom du protocole est CanMoveAlong alors vous pouvez le jeter aux

id <CanMoveAlong> canDo = (id<CanMoveAlong>)p1; 

après avoir vérifié la conformité et appeler directement la méthode

[canDo moveAlongX:1 andY:1]; 

Ce faisant, vous obtenez les deux, vous vous débarrasser de l'avertissement et vous peut passer directement int sans utiliser NSNumber.