Je veux modifier la valeur variable qui est membre d'une structure d'une autre classe. Mais la valeur n'est pas modifiée.
Voici le code. P>
//Structure.. typedef struct { int a; double b; } SomeType; //Class which has the structure as member.. @interface Test2 : NSObject { // Define some class which uses SomeType SomeType member; } @property SomeType member; @end @implementation Test2 @synthesize member; @end //Tester file, here value is changed.. @implementation TesstAppDelegate @synthesize window; - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { // Insert code here to initialize your application Test2 *t = [[Test2 alloc]init]; t.member.a = 10; //After this the value still shows 0 } @end
3 Réponses :
Pour modifier votre variable d'instance "membre", vous devez la définir dans son intégralité. Vous devriez faire quelque chose comme: Le problème est que qui n'accomplira pas Tout, car Fondamentalement, t.member code> est utilisé comme "getter" (puisqu'il n'est pas immédiatement suivi d'un "=" ), donc
t.member.a = 10; code> est identique à celui
[t membre] .a = 10; code> p>
[t membre] code> renvoie une structure, qui est une "valeur r", c'est-à-dire. une valeur valable uniquement pour une utilisation sur le côté droit d'une mission. Il a une valeur, mais il n'a pas de sens d'essayer de changer cette valeur. P>
T.member code> renvoie une copie de votre structure "membre". Vous modifiez ensuite immédiatement cette copie et à la fin de la méthode que la copie est supprimée. P> p>
Oh, t.member.a code> est tout simplement bien pour lisant i> la valeur de
membre.a code>. C'est exactement la même chose que
[t membre] .a code>.
Savez-vous ce que ce son est, d'une altesse? Ce sont les développeurs C # Shrieking C #. Si vous ne me croyez pas, attendez juste. Ils poussent toujours plus fort quand ils sont sur le point d'utiliser la notation de points dans l'objectif-C! YouTube.com/watch?v=tfo3NEZHNLK
@sb. Pourquoi t.member code> renvoie une copie de la structure?
Alors .. Quelle est la qualité de cette affectation si votre structure contient des milliers de primitives et que vous en changez simplement une?
@QuantPoToTato n'est pas extrêmement efficace car toute la structure doit être copiée sur la pile, mais si vous avez vraiment une structure contenant un millier d'efficacité des champs, c'est probablement le moindre de vos préoccupations. Dans ce cas, votre méthode peut renvoyer un pointeur sur la structure et l'affecter directement avec [Membre T] -> A = 10 code>.
Faites un pointeur à votre structure à la place, alors juste une déré à perférence lorsque vous souhaitez en changer une partie.
Exemple: p> puis pour changer une pièce de muntructeur juste faire myClassObject.testruct-> a = 55; code> p> p>
Changer la ligne de synthétisation à: p>
Ensuite, vous pouvez affecter des valeurs dans une ligne de code: p>
@synthesize membre = _member; code> p>
_member.a = 10; code> p>