Как установить сохранение для свойств, вложенных в структуру? - PullRequest
0 голосов
/ 12 октября 2010

В объекте действительно есть что-то, чего я не могу понять.Я знаю, как создавать сохраняемые свойства, но не могу понять, как сделать сохраняемые «подструктурные» поля, которые не являются «общедоступными» свойствами, а только «частными» свойствами (частные свойства управляются только моими методами).

Вот мой код:

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

Я хочу, чтобы имя слота (slotName в структуре) сохранялось каждый раз, когда я назначал его в моих методах, но это не свойство, так как не видно снаружи.

Например, каждый раз, когда я инициализирую его с помощью другой строки NSString, я делаю это:

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

Я действительно чувствую, что это не «хороший» (не элегантный) способ выполнения.

Я думаю, мне следует удалить структуру _device_descriptor и получить что-то вроде этого:

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];     

Но это не лучше, так как я не собираю общие вещи в структуре ...

Есть ли более умный путь?

С уважением, Франц

1 Ответ

1 голос
/ 12 октября 2010

Ты прав; Вы не можете сделать это через синтаксис свойства. Я, вероятно, написал бы функции C для получения и установки полей структуры, а затем просто сделал бы произвольное правило, согласно которому доступ к данным из структур любым способом, кроме функций, является неправильным.

Например, у меня будет:

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);

и так далее.

...