XCode 4 c массивом объектов-c - PullRequest
0 голосов
/ 19 ноября 2011

С компилятором XCode 3 я мог бы управлять массивом объектов, таких как:

@interface myView:UIView
{
    CALayer *layer[4];
}

@property (nonatomic,retain) CALayer **layer;
@end

@implementation myView
@dynamic layer;

- (CALayer **)layer { return layer; }

// I could then access elements like

- (void) example
{
    self.layer[3] = NULL;
}

@end

В компиляторе XCode 4 объявление @property генерирует ошибку «Свойство с сохранением должно быть типом объекта».

Полагаю, что лучший способ исправить это преобразовать в NSArray, но у меня есть 100 строк кода с использованием индекса массива в стиле c (например, self.layer [i]). Есть ли другой способ исправить?

Ответы [ 3 ]

2 голосов
/ 19 ноября 2011

Несколько проблем с этим кодом:

  • Должно быть MyView, а не myView;классы начинаются с заглавных букв.

  • CALayer ** - это , а не тип объекта;это указатель на тип объекта, отсюда и жалоба компилятора.Простое присвоение присваивает компиляции, но все равно будет неправильно.

  • Вероятно, нет причин использовать языковой массив (MyClass foo[4]) для хранения этих данных.Используйте NSMutableArray (вы можете использовать [NSNull null] в качестве замены для "этот слот не заполнен".

Если вы действительно хотите придерживатьсяязыковой массив, отбросьте retain. Просто помните, что вы должны явно управлять сохранением / выпуском объектов в массиве. @property не сделает этого за вас.

Кроме того, пока онможет показаться трудным исправить ваш код, чтобы он был встроен в типичные стандартные шаблоны, но это будет стоить дороже по мере развития кода, и когда-нибудь вы, вероятно, окажетесь в ситуации, когда вам действительно нужно это сделать....

1 голос
/ 19 ноября 2011

Измените его на assign свойство, чтобы не пытаться сохранить необъект?

0 голосов
/ 19 ноября 2011

Вы не можете использовать вызовы управления памятью Objective-C (т.е. сохранять) в массиве C.Вы должны управлять своим массивом, используя стандартную логику C или C ++.Вам нужно самостоятельно распределить память и освободить память.Если вам не нужно сохранять массив, вы можете удалить свойство retain.

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