NSArray d'objets et de Moulage
J'ai une classe A
avec une propriété NSString *name
. Si vous avez un NSArray
et ajouter de nombreux A
objets dans ce tableau, le casting est nécessaire à chaque fois que je l'ai récupérer un objet? c'est à dire
NSString* n = (NSString*)[arr objectAtIndex:1];
Ou est-il un autre moyen de le faire, un peu comme en java où vous avez ArrayList<A> arr
?
OriginalL'auteur bubbles | 2011-09-02
Vous devez vous connecter pour publier un commentaire.
NSArray
ne pas stocker les informations sur les types d'objets contenus dans les présentes. Si vous savez que les types d'objets dans votre tableau, vous pouvez effectuer un cast, que ce soit implicitement ou explicitement:Il n'y a pas de différence dans l'exécution de coût entre implicite et explicite les plâtres, c'est juste une question de style. Si vous obtenez le type de mal, ensuite, ce qui est très susceptible de se produire est que vous allez obtenir le redouté
unrecognized selector sent to instance 0x12345678
exception.Si vous avez une hétérogènes éventail de types d'objets différents, vous devez utiliser le
isKindOfClass:
méthode de test de la classe de l'objet:isKindOfClass: [NSMutableString class]
.Je ne le savais pas. Comment venir?
J'ai remarqué que NSString renvoie également OUI à
[myNSString respondsToSelector: @"appendFormat:];
. ISTM qui changeant et immuable chaînes sont mis en œuvre par l' __NSCFString et qui a une certaine drapeau interne de dire s'il est mutable ou pas. Si vous appelez[myNSString appendFormat: @"world"];
vous obtenez une exception, mais pas une qui indique qu'il ne répond pas à la sélection. ApparemmentappendFormat:
vérifie l'attribut immuable et, si elle est définie, elle soulève une exception. Changeant et immuable chaînes sont, de facto, dans la même classe,__NSCFString
.Ok, il y a aussi
__NSCFConstantString
, pour les littéraux de chaîne.Vous avez raison. Ils sont tous les deux mis en œuvre "par-dessus" CFString, dont le code vous regardez; il a en effet un mutable drapeau. Certains (tous?) de la mutation des fonctions d'appel
CFAssertIsStringAndMutable()
, qui, comme vous pouvez le deviner, utiliseCFAssert
vérifier que la chaîne est mutable.OriginalL'auteur Adam Rosenfield
NSArray
'sobjectAtIndex:
renvoie une variable de typeid
. Ce serait à peu près équivalent au retour d'uneObject
en Java—"nous ne pouvons pas garantir de choses sur ce type de variable." En Objective-C cependant, vous pouvez envoyer des messages àid
variables sans que le compilateur se plaindre. Ainsi, parce que vous savoir que le tableau ne contient queA
cas, vous êtes bon pour l'envoyer à laname
message. Par exemple, la commande suivante va compiler sans avertissement:Cependant, si vous souhaitez utiliser la notation point (par exemple,
[array objectAtIndex:0].name
), vous aurez besoin de lancer leid
à unA *
comme indiqué ici:OriginalL'auteur Chris Doble
C'est la façon de le faire. Vous pouvez effectivement faire l'opération ci-dessus sans le casting du retour, puisque vous êtes en train de lire dans un NSString de toute façon.
OriginalL'auteur Sid
c'est la manière:
Vous n'avez pas besoin de s'inquiéter au sujet de la convenance de type
En fait non, ajoutant à l'ensemble conserve l'objet donc, après que l'extrait de code que vous avez conserver un nombre de +2, de sorte que vous réellement besoin de supprimer l'élément et de le libérer afin qu'il ne pas de fuite, toutes et tous, c'est une mauvaise pratique, je devrais avoir dit que ce code peut conduire à des fuites..
Daniel est juste de signaler que c'est le style pauvres. Il n'y a qu'une seule référence à l'instance de
A
, qui est dans le tableau, mais le tableau et lealloc
ing code de la propriété des terres. /cc @ChuckOh, terriblement désolé. Long de la journée. M'ignorer.
Thx pour souligné: Mais ce n'était pas vraiment le sujet ici!
OriginalL'auteur MUH Mobile Inc.