45 votes

Objets CF vs objets NS

J'essaie de comprendre pourquoi il existe à la fois des objets des FC et des NS, qui semblent faire la même chose et sont interchangeables grâce à un pontage sans frais. Si, par exemple, CFArray et NSArray font la même chose, et que je peux les séparer librement, à quoi servent-elles d'exister? Existe-t-il des règles empiriques sur le moment d'utiliser l'une sur l'autre? Les objets CF sont-ils simplement des objets hérités d'anciens frameworks? Toute idée à ce sujet serait grandement appréciée.

64voto

rob mayoff Points 124153

Pour répondre à vos questions dans l'ordre:

  1. Quel est le point de l'existant? Il ya quelques raisons.

    Si vous souhaitez fournir une API en C, comme le Carbone de l'API, et vous avez besoin des choses comme des tableaux et des dictionnaires de référencé-objets comptés, vous voulez une bibliothèque comme Fondement de Base (qui fournit CFArray), et bien sûr, il doit avoir un C API.

    Si vous voulez écrire des bibliothèques pour des tiers pour une utilisation sur Windows (par exemple), vous devez fournir une API C.

    Si vous voulez écrire une bibliothèque bas niveau, disons pour l'interfaçage avec votre système d'exploitation noyau, et vous ne voulez pas la surcharge de l'Objective-C de messagerie, vous avez besoin d'un C API.

    Donc, ce sont de bonnes raisons d'avoir un Fondement de Base, une pure C de la bibliothèque.

    Mais si vous voulez fournir un niveau supérieur, plus agréable API en Objective-C, vous voulez Objective-C des objets qui représentent des tableaux, des dictionnaires de référence-objets comptés, et ainsi de suite. Si vous avez besoin de la Fondation, qui est un Objectif-C de la bibliothèque.

  2. Quand devez-vous utiliser l'un ou l'autre? En général, vous devez utiliser l'Objective-C classes (par exemple, NSArray) à chaque fois que vous pouvez, parce que l'Objective-C interface est plus agréable à utiliser: myArray.count (ou [myArray count]) est plus facile à lire et à écrire qu' CFArrayGetCount(myArray). Vous devez utiliser le Fondement de Base de l'API uniquement lorsque vous en avez vraiment besoin: lorsque vous êtes sur une plate-forme qui n'a pas Objective-C, ou lorsque vous avez besoin de fonctionnalités que le Fondement de Base de l'API fournit, mais l'Objective-C objets de manque. Par exemple, vous pouvez spécifier des rappels lors de la création d'un CFArray ou CFDictionary qui permettent de stocker des non-référence-objets comptés. L' NSArray et NSDictionary classes ne pas vous laisser faire ça - ils toujours que vous stockiez de référence-objets comptés.

  3. Sont le FC objets les objets hérités? Pas du tout. En fait, Nextstep existé pendant des années avec juste de l'Objective-C de la Fondation de la bibliothèque et des pas de Base de la Fondation de la bibliothèque. Quand Apple a besoin de soutenir à la fois le Carbone de l'API et de l'API Cocoa sur le niveau inférieur du système d'exploitation des installations, ils ont créé de Base de la Fondation de soutien à la fois.

D'ailleurs, la plupart de la Base de la Fondation est de l'open source. Vous pouvez trouver la source pour Mac OS X 10.7.3 version ici: http://opensource.apple.com/source/CF/CF-635.19/

11voto

Rob Napier Points 92148

De base de la Fondation est une API C pour une variété de structures de données communes. La plupart de ces structures de données ont des équivalents dans le Cacao, mais pas tous d'entre eux. La plupart de ceux qui sont équivalentes sont sans frais ponté, ce qui leur permet d'être utilisés de façon interchangeable, mais pas tous d'entre eux, soit.

Numéro sans frais de transition est un très habile mise en œuvre de truc. Si vous voulez les détails sous-jacents, voir la ridiculous_fish post que @Matt Wilding points. C'est le plus autorité sur le sujet (et une influence majeure sur iOS:PTL , chapitre 19, qui explique comment tout cela fonctionne). Mais il n'a pas vraiment d'importance pour la plupart des besoins. Comme Matt notes, vous pouvez généralement prétendre que l' NSArray est le même que pour un CFArrayRef. Ce n'est pas vraiment le cas dans la plupart des cas, mais c'est parfois vrai, et assez près la plupart du temps. C'est la même chose que de dire qu' @"stuff" est le même que l' NSString contenant stuff. C'est surtout vrai, mais pas exactement.

Lorsque les OS 9 déménagé à OS X, c'était très pratique pour l'accès à l'Objective-C-comme des structures de données. De nombreux bas-niveau des cadres aujourd'hui exposer C Api pour des raisons de performances. Vous ne devez pas penser de CF comme "héritage" ou "interne". Vous devriez penser à elle comme de bas niveau et que vous devez utiliser uniquement quand vous avez besoin de la puissance qu'il fournit, ou de traiter avec un framework de bas niveau qui en a besoin.

CF les objets sont souvent plus souples que leurs NS homologues. Par exemple, CFDictionaryRef peut contenir des non-objet des clés et des valeurs, tout en NSDictionary peut pas. (Bien sûr, ils sont sans frais reliés, de sorte que vous pouvez créer un non-conservant CFDictionaryRef , puis de le traiter comme un NSDictionary. Délicate que....)

Comme Apple lance de nouveaux cadres, vous remarquerez que, souvent, ils exposent C Api d'abord, et puis plus tard ajouter Objective-C Api. C'est une raison que c'est une bonne idée pour apprendre les Base de la Fondation, même si vous ne l'utilisez pas tous les jours. Mais lorsque cela est possible, en général, vous devriez être en utilisant ObjC.

3voto

Matt Wilding Points 12931

Il y a un peu d'histoire à cette question. De base de la Fondation est le cerveau de l'opération. Il est écrit principalement en C. Il a été créé par Apple acquisition de CÔTÉ et à leurs Api et doit beaucoup à eux. Le NS* les classes sont souvent seulement l'Objectif de C des interfaces abstraites construites sur le dessus de la FC* types. Donc, quand vous vous demandez pourquoi les deux CFArray et NSArray existe pas, la réponse est qu'ils n'ont pas réellement. NSArrays sont CFArrays, NSStrings sont CFStrings, etc. C'est pourquoi sans frais-l'intégration est possible.

Pour plus intéressante et détaillée de la lecture, je vous invite à consulter ce blog.

1voto

CodaFi Points 29073

CF signifie CoreFoundation. Exposés des objets avec des CF dans leurs noms sont juste ordinaires essentielles objets de la Fondation, écrit en C. Tous les objets sont sans frais comblé avec leur Cocoa Touch Fondation des amis en Objective-C terre. Ils sont généralement opaque pointeurs.

NS est synonyme de NextStep, qui était l'ancien OS que Mac OS X a été construite sur. NS-préfixés objets sont généralement entièrement écrit en Objective-C ou C ou même en C++.

Cela dépend vraiment de ce que vous avez besoin chaque objet pour le faire. Il est certainement plus facile pour moi de travailler dans le plus pur Objective-C avec NSString, alors il est pour moi de travailler dans un mélange de C et Objective-C avec CFString, mais il ya certaines choses que CF les objets peuvent faire que NS objets ne peuvent tout simplement pas (pour la plupart très faible niveau de stuff). CF les objets s'investit beaucoup plus dans le Ref, des mutations, et des inspections de leurs NS homologues.

(Pour référence future, il y a un peu plus de préfixes: CG pour CoreGraphics, de l'INTERFACE utilisateur pour UIKit, QL pour QuickLook, AV pour AVFoundation, DÉPUTÉ de MediaPlayer, MF pour MessageFoundation, GL pour GLKit, et MK pour MapKit)(Si j'ai manqué de tout, je serai heureux d'édition).

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