Как @syntize массив указателей в стиле C? - PullRequest
1 голос
/ 28 апреля 2010

У меня есть свойство, определенное в классе, например:

@interface myClass

UIImageView *drawImage[4];
...
@property (nonatomic, retain) UIImageView **drawImage;
...
@synthesize drawImage; // This fails to compile

Я нашел похожие вопросы в StackOverflow и в других местах, но ни один из них не решал эту проблему. Какой самый Objective-C кошерный способ сделать это?

Ответы [ 3 ]

4 голосов
/ 28 апреля 2010

Вы не можете; вы должны изменить это retain на assign и самостоятельно управлять памятью; поскольку вы не можете отправить -[retain] на UIImageView ** (так как это не объект.)

То есть; вы на самом деле не можете использовать @synthesize, так как это приведет к эпическим утечкам памяти с assign и не будет работать с retain или copy; что вам нужно сделать, это реализовать -drawImage и -setDrawImage: и написать некоторый код доступа.

Но не делай этого. Используйте NSArray.

1 голос
/ 28 апреля 2010

Проблема, с которой вы столкнетесь, заключается в том, что функции не могут возвращать массивы в стиле C в C или Objective-C, а другая проблема, с которой вы можете столкнуться, заключается в том, что вы не можете назначить тип указателя для типа массива ( что ваш синтезатор может пытаться сделать). Существует как минимум два решения:

  1. Используйте NSArray, а не массив в стиле C. Это самый чистый маршрут, тем более что вам нужно управлять памятью только одного объекта, а не четырех.
  2. Обернуть массив в стиле C в struct. Вы не можете возвращать массивы в стиле C прямо из функций, но вы можете вернуть struct, который имеет член массива (имейте в виду, что retain / release не происходит).
    typedef struct {
        UIImage *image[4];
    } ImageCollection;
    ...
    @property (nonatomic, assign) ImageCollection drawImage;
    ...
    @synthesize drawImage;
1 голос
/ 28 апреля 2010

Самый «кошерный» способ - создать NSArray из UIImageView объектов вместо массива в стиле C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...