2010-10-25 5 views
1

Je dois déclarer une propriété pour un tableau C d'un type struct personnalisé. Est-ce que quelqu'un peut expliquer ce que je devrais faire avec ce tableau C en ce qui concerne les déclarations de propriétés? Ne devrais-je pas utiliser une déclaration de propriété?Utilisation d'un tableau C en tant que propriété

J'ai essayé memset() dans la mémoire de la baie et j'ai lamentablement échoué avec une erreur de compilation. Quelqu'un peut-il expliquer cela aussi?

Répondre

2

Cette réponse ne résout pas vraiment votre problème, elle explique simplement pourquoi votre approche n'a pas fonctionné.

En C, vous ne pouvez pas retourner les types de tableau à partir des fonctions. C'est simplement une limitation de la langue (intentionnelle ou non intentionnelle je ne sais pas). Par extension, en Objective-C vous ne pouvez pas retourner les types de tableau à partir des méthodes. Cela signifie également que vous ne pouvez pas utiliser les types de tableau en tant que propriétés, car le compilateur est incapable de synthesize une méthode qui renvoie un type de tableau.

Les tableaux sont automatiquement convertis en types de pointeurs lorsqu'ils sont utilisés dans une expression, vous pouvez donc suivre les conseils de @ Graham et utiliser des pointeurs à la place. L'inconvénient de cette approche est que vous devez savoir exactement combien d'éléments sont dans le tableau afin de ne pas lire accidentellement la fin de l'it. Si le nombre d'éléments est fixe et connu au moment de la compilation, c'est probablement le chemin à parcourir (si vous voulez éviter NSArray pour une raison quelconque).

Il est difficile de répondre pourquoi memset n'a pas réussi à compiler sans voir réellement comment vous l'avez utilisé, mais en général cela est la façon dont il peut être utilisé:

MyStruct someStructs[10]; 

memset(someStructs, 0, sizeof someStructs); 

Alternativement, il est possible de revenir struct des fonctions/méthodes, même si elles contiennent des tableaux. Théoriquement, vous pouvez créer une structure contenant un tableau de MyStruct et utiliser ce nouveau type de structure comme type de propriété. En pratique, ce n'est pas une bonne idée car cela ajoute simplement une couche de complexité.

+0

Vous pouvez également lire/écrire après la fin d'un tableau de syntaxe de tableau. Ce qui suit est légal, bien que brisé, C: int x [2] = {0}; x [27] = 3; –

0

Vous pouvez certainement traiter le tableau comme une propriété, il aura un comportement "assign" car vous ne pouvez pas conserver une structure. Essentiellement, vous êtes toujours totalement responsable de l'allocation de mémoire du tableau.

Vous pouvez également remplacer votre structure par un objet. Ensuite, cela fonctionne plus naturellement avec la machinerie de propriété, et ouvre les classes de collection Foundation comme NSArray à vous.

+0

J'étais un peu incertain sur l'utilisation de NSArray (qui était mon approche initiale). Je voulais juste faire un simple accès direct aux éléments du tableau comme en C, mais je ne savais pas si je pouvais simplement allouer un NSArray et accéder à l'élément 16, par exemple, écrire dedans et lire, ou s'il y avait des différences comportement avec eux que les tableaux C qui ne le permettaient pas.En y repensant, j'imagine que j'aurais dû penser qu'il se comporterait exactement de la même façon que les tableaux C en termes d'accès aux éléments aléatoires et de définition/obtention de leurs valeurs sans avoir à remplir les éléments d'index inférieurs. – Joey

+0

En outre, j'ai quelques problèmes en essayant de le définir comme une propriété. Si j'ai MyStruct mList [5]; en tant que membre var, je ne peux pas faire @property (nonatomic, assign) MyStruct mList [5]; parce que j'obtiens une erreur de compilation de déclaration de mauvaise propriété. – Joey

+0

@Joey: Je pense que vous devrez définir la propriété comme '@property (non atomic, assign) MyStruct * mList;' pour l'utiliser comme un tableau C. Et dans le cas de 'NSArray', vous devez remplir les éléments 0-7 avant de pouvoir utiliser l'élément 8. Vous pouvez utiliser l'objet' [NSNull null] 'pour agir comme un espace réservé pour les valeurs non définies. –

1

Si vous avez ceci:

@interface MyClass 
{ 
    struct MyStruct foo[5]; 
} 
@end 

vous ne pouvez pas avoir une propriété de lecture/écriture du tout. Vous pouvez déclarer une propriété en lecture seule

@property (readonly, assign) struct MyStruct* fooProperty; 

qui vous donnera un pointeur vers le tableau. Cependant, c'est probablement mauvais car cela donne au reste de votre code un accès interne à la structure de MyClass. Il est préférable de mettre en œuvre le KVC indexed accessors, ce que vous devrez faire manuellement.

Questions connexes