Распределение собственности в Objective-C - PullRequest
1 голос
/ 11 февраля 2012

У меня есть следующие вопросы о распределении свойств в Objective-C,

если у меня есть следующее свойство:

@property (nonatomic, retain) NSArray *arr;
@synthize arr=_arr;

я должен выделить этот массив как:

arr=[[NSArray alloc]init];

и, если мне нужно, где лучше всего его выделить?

Я знаю, что должен освободить его, но сохранение свойства увеличит его счетчик хранения на 1, а распределение его увеличит его еще на 1, я прав.

1 Ответ

5 голосов
/ 11 февраля 2012

Вы можете выделить массив двумя способами:

  1. Установите ивар непосредственно с сохраненным значением, например так:

    _arr = [[NSArray alloc] init];
    
  2. Установите свойство с автоматически освобожденным значением, как это:

    self.arr = [NSArray array];
    

Вы можете сделать это в методе init вашего класса, хотя вы не сказали, какой суперкласс он использует, поэтому я не уверен, как должен выглядеть метод init. Если это NSObject, он будет выглядеть так:

- (id)init
{
    if ((self = [super init]))
    {
         self.arr = [NSArray array];
    }
    return self;
}

Но если это UIViewController, вам нужно использовать initWithNibName: bundle, например:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)bundleOrNil
{
    if ((self = [super itWithNibName:nibNameOrNil bundle:bundleOrNil]))
    {
         self.arr = [NSArray array];
    }
    return self;
}

Затем вам нужно освободить его в вашем методе dealloc, например:

- (void)dealloc
{
    [_arr release];
    [super dealloc];
}

Однако вы должны иметь в виду, что NSArrays не могут быть изменены после их создания, поэтому вы, вероятно, хотите либо инициализировать его некоторыми объектами, например:

self.arr = [NSArray arrayWithObjects:object1, object2, nil];

Или, если вы хотите добавить объекты к нему позже, вы должны определить его как NSMutableArray, например:

@property (nonatomic, retain) NSMutableArray *arr;

И начать с:

self.arr = [NSMutableArray array];

Это позволит вам добавить объекты к нему позже.

Кстати, если вы получаете ошибки в своем методе dealloc, это, вероятно, означает, что ваш проект использует ARC, новую технологию в iOS 5, которая означает, что вам больше не нужно писать релизы и сохранять операторы.

Если вы не используете ARC, я предлагаю вам сделать это, потому что это избавит вас от необходимости беспокоиться об этом материале сохранения / выпуска - любой разработчик iOS, который только начинает работать, должен действительно использовать ARC для каждого проекта, но потому что был представлен только в iOS 5, многие книги по Objective-C не охватывают его.

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