10
votes

COCOA Objective-C Propriété C Structure Attribution échoue

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


0 commentaires

3 Réponses :


22
votes

Pour modifier votre variable d'instance "membre", vous devez la définir dans son intégralité. Vous devriez faire quelque chose comme: xxx

Le problème est que t.member est utilisé comme "getter" (puisqu'il n'est pas immédiatement suivi d'un "=" ), donc t.member.a = 10; est identique à celui [t membre] .a = 10;

qui n'accomplira pas Tout, car [t membre] 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.

Fondamentalement, T.member 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.


5 commentaires

Oh, t.member.a est tout simplement bien pour lisant la valeur de membre.a . C'est exactement la même chose que [t membre] .a .


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 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 .



4
votes

Faites un pointeur à votre structure à la place, alors juste une déré à perférence lorsque vous souhaitez en changer une partie.

Exemple: xxx

puis pour changer une pièce de muntructeur juste faire myClassObject.testruct-> a = 55;


0 commentaires

1
votes

Changer la ligne de synthétisation à:

@synthesize membre = _member;

Ensuite, vous pouvez affecter des valeurs dans une ligne de code:

_member.a = 10;


0 commentaires