2010-10-12 32 views
0

Il y a vraiment quelque chose à objc que je ne peux pas comprendre. Je sais comment faire des propriétés retenues mais ne peux pas comprendre comment faire des champs "sub" qui ne sont pas des propriétés "publiques" mais seulement des propriétés "privées" (les propriétés privées ne sont gérées que par mes méthodes).Comment définir la conservation des propriétés imbriquées dans struct?

Voici mon code:

struct _device_descriptor { 
    NSInteger accessoryNumber;         // Accessory the device belongs to 
    NSInteger slotNumber;          // Slot number used for the device 
    NSString* slotName;           // Slot name 
}; 
typedef struct _device_descriptor device_descriptor_t; 

#define NUMBER_MAX_CARD_READERS 10 
#define NUMBER_MAX_ACCESSORIES 10 
@interface CardDeviceManager : NSObject { 
    // Card devices (among accessories) 
    NSInteger m_numberOfCardDevices;        // Number of devices. 
    NSMutableArray* m_accessoryList;        // List of all accessories 
@private 
    // Accessories 
    NSInteger m_numberOfAccessories;        // Number of accessories 
    NSInteger m_numberOfAcceptedAccessories;       
    device_descriptor_t m_cardDevice[NUMBER_MAX_CARD_READERS];  // Array of card devices. 
} 

Je veux que le nom de l'emplacement (slotname dans le struct) conserver chaque fois que je lui confient dans mes méthodes, mais ce n'est pas une propriété car non visible de l'extérieur .

Par exemple, chaque fois que je l'initialiser avec une autre NSString, je fais ceci:

//_tmpName is a NSString 
// Warning: slotName must be released later since we retain it. 
m_cardDevice[i].slotName = [[NSString stringWithString: _tmpName] retain]; 

Je me sens vraiment ce n'est pas une façon « bonne » (pas élégant) de faire.

Je pense que je devrais enlever le struct _device_descriptor et quelque chose comme ceci:

NSInteger accessoryNumber[NUMBER_MAX_CARD_READERS];     // Accessory the device belongs to 
    NSInteger slotNumber[NUMBER_MAX_CARD_READERS];     // Slot number used for the device 
    NSString* slotName[NUMBER_MAX_CARD_READERS];  

Mais ce n'est pas mieux depuis que je ne crois pas que les choses communes dans un struct ...

Y at-il un façon plus intelligente?

Cordialement, Franz

Répondre

1

Vous avez raison; vous ne pouvez pas le faire via la syntaxe de propriété. J'écrirais probablement des fonctions C pour obtenir et mettre en place les champs struct, et juste faire une règle arbitraire que l'accès aux données à partir des structures d'une autre manière que les fonctions est incorrect.

Par exemple, je dois:

device_descriptor_t* DeviceDescriptorCreate(NSInteger accessoryNumber, 
              NSInteger slotNumber, 
              NSString* slotName); //malloc() 

void DeviceDescriptorDestroy(device_descriptor_t* device); //free() 
void DeviceDescriptorSetSlotName(device_descriptor_t* device, NSString* slotName); //release old value, set new one 
NSString* DeviceDescriptorGetSlotName(device_descriptor_t* device); 

Et ainsi de suite.