63 votes

Quel est le bon, nil ou NULL, pour marquer "pas de bloc Objective-C"?

Si je ne souhaite rien passer pour un bloc Objective-C, quel mot-clé dois-je utiliser, NULL ou nil ? Je pose cette question car un bloc Objective-C est un objet Objective-C (comme je le sais), mais représenté sous la forme d'un pointeur de fonction.

NULL et nil indiquent tous les deux un pointeur 0x0 , mais ils sont différents sémantiquement. Donc, je suis préoccupé par cela.

83voto

zneak Points 45458

Les blocs ne sont pas représentés comme des pointeurs de fonction. Ils sont représentés comme des blocs, et cela est indiqué par l' ^ symbole dans leur déclaration. Sous le capot, la seule ressemblance est la syntaxe d'appel. Sinon, ils sont tous les deux très, très différents.

Il est souvent utile d'appeler des méthodes sur eux. Par exemple, si vous n'utilisez pas de collecte des ordures, vous devez appeler l' copy méthode sur des blocs si vous voulez les garder pour plus tard. Avec l'avènement de l'automatique conserver le comte, c'est même la seule façon de copier un bloc, depuis l'ARC de pointeur de la fonte des règles de vous empêcher d'utiliser l' Block_copy macro.

NULL "est, selon le compilateur, soit juste 0 ou (void*)0. Ce serait travailler pour n'importe quel type de pointeur. Toutefois, en raison des règles de la langue de l'Objective-C, vous obtiendrez un message d'avertissement si vous essayez d'envoyer un message à un type qui ne peut pas exprimés directement à l' id (et une erreur si vous utilisez l'ARC). nil être (id)0, c'est le mot clé préféré pour représenter un (l'absence de) de l'objet.

Puisqu'il peut être utile pour envoyer des messages à des blocs, vous devez utiliser nil pour eux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X