/ / Si nous stockons un NSMutableDictionary dans un NSDictionary, pouvons-nous plus tard l'utiliser à nouveau comme NSMutableDictionary? - ios, objective-c, nsdictionary, nsmutabledictionary

Si nous stockons un NSMutableDictionary dans un NSDictionary, pouvons-nous le réutiliser ultérieurement en tant que NSMutableDictionary? - ios, objective-c, nsdictionary, nsmutabledictionary

Si nous remplaçons une variable d'instance NSDictionary par un NSMutableDictionary que nous créons, pouvons-nous la réutiliser plus tard comme NSMutableDictionary en la convertissant en NSDictionary?

Exemple:

créer et stocker le NSMutableDictionary dans l'emplacement NSDictionary

NSMutableDictionary *muta = [[NSMutableDictionary alloc] initWithObjects:NSArray forKeys:NSArray];
Object.nsDictionary = muta;

Obtenez le dictionnaire plus tard

NSMutableDictionary *muta2 = (NSMutableDictionary*) Object.nsDictionary;
//Do stuff like Add objects with it
[muta2 setObject:id forKey@"key"];

Faut-il recréer un NSMutableDictionary à partir dele NSDictionary que nous tirons de l'objet ou le conserve-t-il "sa" mutabilité "? Pouvez-vous me dire pourquoi un objet sous-classé conservera ou non ses méthodes et propriétés spécifiques lors du remplacement d'une super classe générique?

Réponses:

3 pour la réponse № 1

Si votre propriété est déclarée NSDictionary alors vous ne devriez pas faire d'hypothèses quant à savoir si elle est réellement modifiable ou non.

Le code approprié doit être:

NSMutableDictionary *muta2 = [Object.nsDictionary mutableCopy];

Cela fonctionne quel que soit le type de dictionnaire réellement stocké dans la propriété.


0 pour la réponse № 2

Dans votre question, vous confondez deux choses différentes: vous faites référence à l'attribution à un variable d'instance mais montrer le code qui montre l'attribution à un propriété. Ce ne sont pas les mêmes. Vous semblez également avoir un malentendu affectation en y faisant référence comme remplaçant un objet.

Dans Objective-C (et dans de nombreux autres langages, mais pas tous), un objet est désigné par un référence. Ce sont ces références qui sont attribué en variables. Ainsi par exemple dans:

NSMutableDictionary *a = [NSMutableDictionary new];
NSMutableDictionary *b = a;

Le côté droit de la première affectation est une expression qui crée un nouvel objet et renvoie une référence à cet objet. Cette référence est ensuite stockée dans la variable a. La deuxième ligne copie le référence, ne pas l'objet, stocké dans a et stocke dans la variable b.

Après ces deux lignes, un objet et deux variables ont été créés, et les deux variables font référence exactement le même objet. Affectation d'une référence à un objet ne change pas l'objet auquel il se réfère. Donc, si nous changeons maintenant le code en:

NSMutableDictionary *a = [NSMutableDictionary new];
NSDictionary *b = a;

Nous avons toujours un objet et deux variables créés, et les deux se réfèrent toujours exactement au même objet. Dans ce cas, l'affectation est autorisée en tant que NSMutableDictionary est un sous-classe de NSDictionary - c'est un objet de type NSMutableDictionary est aussi de type NSDictionary, il offre tout de même le même comportement que ce dernier.

D'après votre question "Pouvez-vous me dire pourquoi un objet sous-classé conservera ou non ses méthodes et propriétés spécifiques lors du remplacement d'une super classe générique?" vous devez lire héritage et comprendre comment fonctionne le sous-classement.

Une fois que vous "avez stocké une référence à une sous-classe dans une variable de type superclasse, a dans b dans le code ci-dessus, alors que vous n'avez pas changé leobjet référencé de toute façon vous avez perdu la connaissance immédiate que la référence est en fait à un objet de la sous-classe - tout ce que vous pouvez immédiatement déclarer sur une référence stockée dans b ci-dessus est qu'il se réfère à un objet qui est au moins un NSDictionary, mais mai être de toute sous-classe de NSDictionary.

Si vous êtes absolument certain, ou tout comme l'écriture de programmes qui se cassent, vous pouvez dire au compilateur de vous faire confiance b contient une référence à un NSMutableDictionary en utilisant un jeter:

NSMutableDictionary *c = (NSMutableDictionary *)b;

Faites-le et le compilateur vous fait confiance, mais si b ne contient pas de référence à un NSMutableDictionary puis votre utilisation ultérieure de c sera probablement invalide et votre programme sera interrompu.

Ce que vous devez faire est de tester si la référence fait référence à un NSMutableDictionary ou pas, et vous le faites avec la méthode isKindOfClass::

if ([b isKindOfClass:NSMutableDictionary.class])
{
// b refers to an NSMutableDictionary
NSMutableDictionary *c = (NSMutableDictionary *)b;
// do something with c
}
else
{
// b does not refer to an NSMutableDictionary
// handle this case
}

Retour à Propriétés: une propriété est deux méthodes (en supposant que la lecture-écriture, vous pouvez avoir des propriétés en lecture seule), un getter et un setter, qui se combinent pour fournir une abstraction d'un variable - vous pouvez "lire" et "leur attribuer" en utilisant un pointnotation dans les expressions. Cependant, comme ils appellent une méthode, plutôt que d'effectuer des lectures directes ou des affectations à une variable, cette méthode peut changer si elle est lue ou affectée. En particulier, une propriété typée objet déclarée avec la propriété copie l'attribut fera une copie du objet c'est la référence. Par exemple:

@property (copy) NSDictionary *c;

...

NSMutableDictionary *a = [NSMutableDictionary new];
NSDictionary *b = a;
self.c = a;

puis a Et b les deux se réfèrent à la même objet qui est une instance de NSMutableDictionary; alors qu'en raison de la copy attribut,crefers to a *distinct* object which is an instance ofNSDictionary ».

Vous pouvez maintenant voir pourquoi utiliser variable d'instance et propriété interchangeable dans votre question n'est pas juste - ce qui est attribué peut être différent selon qu'il s'agit d'une variable ou d'une propriété.

Vous devez lire sur les objets, les références d'objet, l'héritage et les propriétés.

HTH.