7
votes

Obtenez l'adresse d'une propriété Objective-C (qui est une structure C)

J'ai une classe Objective-C qui contient une structure de style C. Je dois appeler une fonction C passant un pointeur sur cet élément d'objet (A.K.A. Propriété). Pour la vie de moi, je ne peux pas comprendre comment obtenir l'adresse de cette structure C. Utilisation de l'opérateur traditionnel & code> pour obtenir l'adresse, je reçois une erreur de compilateur Lvalue.

MyClass* myClass = [[MyClass alloc] init];

MyStruct* p = &(myClass.myStruct);


2 commentaires

Je ne sais pas si cela fonctionnera, mais essayez MMStructeur * p = (mytructeur *) & (myClass.mystru.anumber);


Le & opérateur prend un lvalue. Le résultat d'un appel de méthode est une r devalue.


4 Réponses :


2
votes

muntructrum muntruct est privé dans myClass , je suppose que lorsque vous faites myClass.mystruct Vous ne faites référence que de la méthode de l'accessor générée non pas le réel Structure.

Je ne pense pas que vous puissiez accéder à la variable d'instance (structure dans ce cas) de l'extérieur car il est privé.


2 commentaires

Moi aussi, je suppose que myClass.Mystructure d'obtenir la valeur renvoyée par la méthode accessive - pas la structure réelle qui est ce que je veux. En supposant, je fais la variable d'instance privée ... Comment puis-je obtenir un pointeur à la structure réelle et non à la méthode de l'accesseur?


Vous pouvez essayer de retourner l'adresse à partir d'une méthode de membre (voir la réponse de Chuck) ou vous pouvez ajouter une méthode à MyClass Class qui appellera l'API C et transmettre l'adresse de la structure du muntrox.



2
votes

Pour obtenir un pointeur à la variable d'instance de muntructeur, vous devez écrire une méthode qui renvoie un pointeur sur cette variable d'instance.

- (void)getMyStructPointer:(MyStruct **)outStruct {
    *outstruct = &myStruct;
}


2 commentaires

Sauf si la structure n'est très grande; L'utilisation de la mémoire pourrait potentiellement être un problème.


Peut-être setmystructpointer: ?



2
votes

La question elle-même démographie un manque de compréhension d'au moins la terminologie.

Une propriété est une interface composée de deux méthodes (ou d'une pour une version) rendues publiques par l'objet, à savoir les méthodes Getter et Setter, dans cette CAS: P>

- (MyStruct*) getAddressForSettingMyStruct;


1 commentaires

Cette réponse prend une sorte de snob. Sois gentil.



4
votes

Il y a souvent de bonnes raisons de faire ce que le poste d'origine est demandé, étant donné que les applications de l'objectif-C doivent souvent travailler avec des API C / C ++ qui prennent des pointeurs vers des structures et des types similaires, mais dans une application de cacao, mais dans une application de cacao que vous souhaitent souvent stocker de telles données dans des classes de l'objectif-C pour la gestion des données, la collecte dans les matrices et les dictionnaires, etc.

Bien que cette question ait été portée pendant un moment, je ne vois pas la réponse claire, qui est: vous pouvez avoir un Méthode qui renvoie l'adresse des données qui sauvegarde de votre propriété, mais dans cette méthode n'utilise pas "Soi" ou passera dans l'accesseur et ne fonctionnera toujours pas. P>

- (const MyStruct*) getMyStructPtr
{
    return &mystruct;
}


3 commentaires

En exemple, un exemple concret Pourquoi cela est utile - je fais du travail de coremridi et je dispose d'un objet de l'objectif-C enroulant la structure de l'entretien du MiPacket qui me permet de le stocker dans Nsarrays et d'ajouter des méthodes de commodité. Les méthodes de l'API-cadre en C nécessitent un pointeur de const à la structure, de sorte que ma classe Objective-C a une méthode comme ci-dessus pour renvoyer le pointeur sur le membre de données. Pour les types de struct simples, il peut être préférable de simplement utiliser NSValue, mais comme la dynamique de l'entretien est dynamique (elle peut être plus grande que sa taille déclarée) une classe de wrapper personnalisée est la voie à suivre.


Merci, maintenant, mes sous-classes peuvent enfin obtenir à la CGAFFINETANSFORMED dans la classe des parents.


J'ai utilisé votre solution dans une réponse à une ancienne question connexe: objectif -C Adresse de l'expression de propriété