0

objc 中确实有一些我无法理解的东西。我知道如何制作可保留的属性,但不明白如何制作可保留的“子”结构字段,这些字段不是“公共”属性,而只是“私有”属性(私有属性仅由我的方法管理)。

这是我的代码:

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

我希望每次在我的方法中分配插槽名称(结构中的插槽名称)时都保留它,但这不是一个属性,因为从外部看不到。

例如,每次我用另一个 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];     

但这并没有更好,因为我没有在结构中收集常见的东西......

有没有更聪明的方法?

问候,弗兰兹

4

1 回答 1

1

你是对的; 你不能通过属性语法来做到这一点。我可能会编写 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);

等等。

于 2010-10-12T15:31:27.670 回答