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 に答える