2010-08-04 10 views
1

Je me demandais si l'objectif C ne vérifie pas si un pointeur sur un objet est nul avant d'appeler la fonction.Passer un objet nul à une fonction

Par exemple, que j'ai un

myObject* ptr; 

et initialiser

ptr = nil; 

et appelez

[self myFunction:ptr]; 

où maFonction est ma propre fonction et ne pas vérifier pour voir si la l'objet est nul. J'ai entendu quelque part que l'objectif C n'appellera pas la fonction si elle est nulle? Est-ce vrai et mon code serait-il en sécurité?

La raison pour laquelle je pose cette question est parce que j'implémente une application universelle, et que j'ai une instance UIView qui ne fonctionnera que pour l'ipad. Mais, je fais beaucoup d'appels de fonction pour cette vue, et au lieu de faire des vérifications de condition pour voir si c'est un ipad avant d'appeler la fonction, ce serait génial si je pouvais définir la vue comme nulle si c'est un iphone.

De même, si le constructeur d'interface a alloué l'objet et que j'ai défini le pointeur sur zéro, y aura-t-il une fuite de mémoire ou le constructeur saura-t-il libérer l'objet?

Merci

Répondre

6

Vous pouvez toujours fournir une méthode avec un argument nil, mais je pense que ce que vous pourriez malentendu sur la messagerie nil.

MyClass *object = nil; 
[object doSomething]; // nothing done, because object is nil 

object = [[MyClass alloc] init]; 
[object doSomething]; // does something, because object points to an instance 

Pour démontrer la fourniture nil comme argument:

NSMutableDictionary *myDict = [NSMutableDictionary dictionary]; 
[myDict setObject:@"Value 1" forKey:@"Key 1"]; 
[myDict setObject:nil forKey:@"Key 1"]; // perfectly valid 
// myDict is empty again after setting nil value for "Key 1". 

myDict = nil; 
[myDict setObject:@"Value 1" forKey:@"Key 1"]; // nothing happens! 

Dans les cas ci-dessus, et objectmyDict sont appelés le récepteur “ ”. Lorsque le destinataire est nil, aucune action n'est effectuée. Ceci est tout à fait différent que d'autres langages de programmation, par exemple, en C++ ce qui suit est pas valide:

MyClass *object = NULL; 
object->doSomething(); // oops, this is not allowed 
+2

Oui, et pour être plus clair à l'affiche originale: votre compréhension est à l'envers. Si ** l'objet ** est "nul", rien ne se passe. Si l'argument ** est nul, la méthode est toujours appelée, et soit ne gère pas comme prévu, soit gonfle. Il n'y a pas de magie autour des arguments. –

+0

Merci pour les réponses, les gars. Oui, ça a répondu à ma question. Désolé, je viens de la programmation procédurale et n'ai pas eu beaucoup d'expérience avec la POO, donc je suis habitué à passer des arguments et à oublier le concept de récepteur. Oui, la majeure partie de mon code est au format [myObject myFunction], donc je devrais pouvoir définir myObject comme nul. Je suis juste inquiet si le système passe mon objet, maintenant. – user396004

+0

Cela peut être utile si vous réalisez qu'en plus des arguments que vous avez passés explicitement, self et _cmd sont présents dans chaque méthode en tant qu'arguments implicites. 'self' (le destinataire) est juste un argument implicite lorsque votre méthode est invoquée. – NSResponder

0

En ce qui concerne la mémoire, si vous avez l'objet dans le fichier NIB puis définissez sa sortie à zéro dans le code, il y aura une fuite de mémoire. Vous devriez libérer l'objet et le mettre à zéro.

Dans ce cas, il peut être judicieux de créer simplement l'objet s'il s'agit d'un iPad et de laisser la variable nulle si c'est un iPhone. De cette façon, vous n'avez pas à faire face à des références parasites qui pourraient apparaître si vous créez l'objet dans le fichier NIB. Cela peut être ou ne pas être un problème, mais il est probablement préférable de créer des conditions plutôt que de les détruire conditionnellement.

+0

Hmm, c'est une bonne idée. Je vais devoir le considérer, mais je suis nouveau à la programmation iphone et le constructeur de l'interface est certainement une béquille pour moi comme la programmation des dimensions manuellement pourrait être fastidieuse avec tous les paramètres, en particulier les contrôles tels que le contrôle segmenté et les boutons . En outre, le code que je construis utilise principalement les fichiers nib. Merci pour la prise de fuite de mémoire, cependant! – user396004

+0

Question rapide, le constructeur de l'interface ne va pas essayer de libérer mon objet après que la vue soit terminée, n'est-ce pas? Utilise-t-il release ou dealloc, parce que s'il essaye de le libérer après que je l'ai libéré, j'aurai une erreur de faute, n'est-ce pas? – user396004

+0

http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmNibObjects.html –

Questions connexes