web-dev-qa-db-fra.com

NULL vs nil en Objective-C

Dans observeValueForKeyPath:ofObject:change:context: _ pourquoi la documentation utilise-t-elle NULL au lieu de nil sans spécifier de pointeur de contexte?

179
erikprice

nil ne devrait être utilisé qu'à la place d'un id, ce que nous Java et C++ considéreraient comme un pointeur sur un objet. Utilisez NULL pour les pointeurs non-objets.

Regardez la déclaration de cette méthode:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
    change:(NSDictionary *)change context:(void *)context

Le contexte est un void * (c'est-à-dire un pointeur de style C), vous utiliserez donc certainement NULL (qui est parfois déclaré comme (void *)0) plutôt que nil (qui est de type id).

226
Paul Tomblin

Ils sont techniquement identiques (0), mais nil est généralement utilisé pour un type d'objet Objective-C, tandis que NULL est utilisé pour les pointeurs de style c (void *).

64
Marc Charbonneau

Ils sont techniquement identiques et ne diffèrent que par leur style:

  • Le style Objective-C dit que nil est ce qu’il faut utiliser pour le type id (et les pointeurs sur les objets).
  • Le style C dit que NULL est ce que vous utilisez pour void *.
  • Le style C++ dit généralement que vous devriez simplement utiliser 0.

J'utilise généralement la variante qui correspond à la langue où le type est déclaré.

52
Andrew

NULL est le C equivalent de nil, un pointeur sur rien;

nil is zero typed as id,

NULL is zero typed as void*.

n point important vous ne pouvez pas envoyer de message à NULL. Il est donc préférable d’utiliser nil dans l’objectif C à de nombreux endroits.

12
user2560622

Ils sont presque la même chose sauf,

nil est utilisé dans un style Objective-C. où NULL est pour les pointeurs de type C et est typé à (void *).

3
dan14941