2012-03-17 18 views
7

Mi sono chiesto perché Apple utilizza i tipi di dati in Core Foundation che sono tipizzati in un tipo di puntatore mentre in Cocoa non lo sono.Perché Apple digitava in precedenza tipi di riferimento (puntatore) ma non ora?

Ad esempio, si farebbe riferimento a un oggetto UIColor come UIColor * mentre un riferimento a un oggetto CGColor sarebbe CGColorRef? O NSURL * e CFURLRef? Perché non usare sempre solo CGColor * e CFURL *? Oppure, al contrario, perché non esistono tipi UIColorRef o NSURLRef, dal momento che non si accede mai direttamente a UIColor o NSURL?

Oppure, ad esempio, perché è id e non id *, poiché in realtà è un puntatore e può essere tipizzato in void *?

In particolare, c'è qualche ragione per cui Apple aveva l'abitudine di farlo nei vecchi framework, ma ha smesso di farlo in Cocoa? È semplicemente una questione di stile?

+0

Cocoa (come NeXTStep) è in realtà più vecchio di Core Foundation. –

+0

Ah, non me ne sono reso conto. Ho sempre pensato che fosse il più recente. –

+0

E in realtà ora che ne parli, mi sono reso conto che faceva parte di NeXTStep, credo che stavo pensando più recente come parte dei framework di Apple. –

risposta

8

Ciò che Matt ha detto, ma c'è un po 'di più.

I typedef nelle API basate su C consentono inoltre di nascondere i dettagli di implementazione. Ad esempio, puoi avere il seguente senza mai definire la struttura __CFURL in un'intestazione pubblica.

typedef __CFURL *CFURLRef; 

Objective-C ha avuto per lungo tempo questo tipo di funzioni in forma di categorie e, recentemente aggiunto, la capacità di muoversi esempio dichiarazioni di variabili dal file di intestazione. Aspettatevi che, nel tempo, vedrete tutte le variabili di istanza rimosse dai file di intestazione pubblica nell'SDK.

Si noti che i framework Cocoa sono lunghi, lunghi e pre-datati CoreFoundation.

Per quanto riguarda il motivo, viene utilizzato id anziché id *, che risale a quando Objective-C è stato creato per la prima volta nei primi anni '80. Nello specifico, la nozione del linguaggio era che avresti costruito "circuiti integrati software" che potrebbero essere "collegati" come circuiti integrati reali. L'obiettivo era di mantenere i bit C intorno come dettagli di implementazione e, idealmente, non esposti nelle tue API.

Per quanto riguarda il motivo per cui si termina con NSString * invece di NSString, che è in gran parte esattamente a causa della base C del linguaggio. Ho scritto un fairly detailed answer in una domanda SO leggermente diversa che è rilevante.

Probabilmente troverai anche this answer relevant.

+0

Wow ottima risposta, grazie :) –

+0

Ah nice @bbum :-). Stavo per dire anche nella mia risposta "ma per favore aspetta @bbum per parlare"! Ho persino cercato di trovare una risposta. Giuro che hai scritto su 'id' vs' id * 'prima, ma completamente fallito. Ottima risposta qui però. – mattjgalloway

1

Il motivo per NSURL* rispetto a CFURLRef è praticamente lo stile di codifica. Cocoa è un'API Objective-C e lo stile generale in Objective-C è di non avere un typedef mentre Core Foundation è un'API C e lo stile generale è quello di usare un typedef. È praticamente uno stile di programmazione.

id vs id* - Non sono del tutto sicuro che con questo, ma la mia ipotesi è che è storica e volevano solo per avere la base "oggetto" di essere senza il *. Non so per certo la storia di quello, però. Ma di nuovo sarà solo una cosa di stile.