2009-05-09 6 views
7

Si vous initialisez un NSMutableArray avec la méthode de commodité de NSArray comme ci-dessus, obtenez-vous un NSArray ou un NSMutableArray?Initialiser NSMutableArray: [tableau NSMutableArray];

Des conséquences?

(je sais que NSMutableArray a « arrayWithCapacity :, je suis curieux)

+1

J'apprécie la discussion intéressante ci-dessous pour une question simple. Il apporte quelques subtils points Cocoa. –

Répondre

11

Si vous initialisez à l'aide.

NSMutableArray *array = [NSMutableArray array]; 

vous obtenez un NSMutableArray Une grande caractéristique de l'Objective-C est que les méthodes de classe sont héritées par les sous-classes

Ainsi, dans une méthode de classe que vous pouvez faire quelque chose comme ceci:.

+(id)array { 
    return [[[self alloc] init] autorelease]; 
} 

et self fera référence à l'objet de classe où le code est en cours d'exécution (NSArray ou NSMutableArray).

+0

ahh, intéressant. donc auto-référence l'objet de classe: NSMutableArray. Ça a du sens. Je me demandais pourquoi mon code ne cassait pas! –

+1

Je pense que vous devriez faire: return [[[self alloc] init] autorelease]; –

+0

Vous avez raison, je vais changer l'exemple de code. – pgb

4

Mise à jour: Même si mon conseil de "tester vous-même" est généralement une bonne idée, c'était un peu gâchette-heureux dans ce cas. Merci à Jim dans les commentaires de souligner que ma suggestion ci-dessous ne fonctionne pas bien pour ces classes, car les différentes formes de NSArray sont toutes implémentées par une classe de pontage sans frais CoreFoundation.

----- Réponse originale pour le contexte ci-dessous -----

La meilleure façon de répondre à une question comme celui-ci est de tester vous-même. Essayez d'allouer le tableau de la façon dont vous étiez curieux, puis NSLog de votre code:

NSLog (@ "Nous avons un% @", NSStringFromClass ([theArray class]));

+1

Sûrement que cela retournerait toujours 'NSCFArray'? –

+0

Bon point, Jim. J'ai oublié cette particularité de NSArray. Modifier ma réponse ci-dessus. Merci. – danielpunkass

+0

Hmmm intersester. Donc même un NSMutableArray crachera un NSCFArray? Cela rend l'introspection difficile et vous permet de savoir si vous avez un objet modifiable avant de le modifier. Je suppose que vous pouvez faire respondsToSelector dans ce cas. Sur une note de côté merci pour votre podcast génial. Je suis retourné et j'ai écouté la plupart de vos épisodes passés et ceux de Manton. Assez divertissant et informatif. –

Questions connexes