Установка свойства класса Objective C, не используя сам ссылка

Это - действительно слишком большая проблема для ответа полностью в этом формате. Сделайте себе одолжение и пойдите, покупают Параллелизм Java на практике . Нет никакого лучшего ресурса для параллелизма на Java 5 + платформа там. Существуют целые главы посвящены этому предмету.

На предмет уничтожения Вашего процесса во время вызова JDBC, который должен быть прекрасным. Я полагаю, что существуют проблемы с прерыванием вызова JDBC (в котором Вы не можете?), но это - другой вопрос.

6
задан Dana 18 August 2009 в 18:35
поделиться

4 ответа

Это также могло бы сработать правильно:

- (void)viewDidLoad {     
    stuff = [[NSArray alloc] initWithObjects:@"", @"Item 1", @"Item 2",   
                                       @"Lorem", @"Ipsum", nil];
}

Поскольку массив был сохранен функцией alloc. Но обычно лучше придерживаться точечной нотации, если у вас есть свойство, и использовать методы создания массива автозапуска, при которых вы получаете «бесплатно» удержания из свойства:

- (void)viewDidLoad {     
    NSArray *arr = [NSArray arrayWithObjects:@"", @"Item 1", @"Item 2",   
                                       @"Lorem", @"Ipsum", nil];
    self.stuff = arr;

}

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

- (void)dealloc {     
  [stuff release]; stuff = nil;
}
4
ответ дан 8 December 2019 в 16:08
поделиться

файл = ... напрямую ссылается на резервное поле свойства. Это не увеличивает счетчик удержания. В результате освобождение объекта в другом месте может привести к уменьшению его отсчета до нуля и его освобождению, пока вы все еще удерживаете ссылку на него. Кроме того, это может вызвать утечку памяти для предыдущего значения свойства.
Иногда кажется, что это работает, потому что объект, вероятно, еще не освобожден кем-то другим.

С другой стороны, self.stuff = ... отправит сообщение методу доступа set свойства, который позаботится о счетчике сохранения.

3
ответ дан 8 December 2019 в 16:08
поделиться

Разница между действием:

stuff=arr;

и

self.stuff=arr;

заключается в том, что во втором случае вы фактически вызываете автоматически синтезированный метод доступа setStuff:, который сохраняет массив. В опубликованном вами коде массив создается с помощью alloc / initWithObjects, поэтому у него уже есть счетчик сохранения 1.

Вам просто нужно изменить удаление вызова на [arr release] в вашем методе viewDidLoad:, и все будет хорошо:

- (void)viewDidLoad {     
    NSArray *arr = [[NSArray alloc] initWithObjects:@"", @"Item 1", @"Item 2",   
                                       @"Lorem", @"Ipsum", nil];
    stuff = arr;
}

Как вы заметили, вы также можете "исправить" это с помощью self.stuff. Я бы не рекомендовал делать это, поскольку это скрывает смысл кода и добавляет дополнительную работу, которая в большинстве случаев не требуется. В общем, рекомендую не использовать «селфи». синтаксис в методах вашего экземпляра.

3
ответ дан 8 December 2019 в 16:08
поделиться

Когда вы используете (self) и точечный синтаксис, учитывая способ, которым вы определили свойство (неатомический, сохранить), NSArray (материал) сохраняется.

Если вы этого не сделаете, вы все еще выполняете присвоение, но вы не сохраняете массив, кроме неявного сохранения через alloc + init - и сразу же освобождаете его.

Вы можете обойтись без назначения через "self.stuff = arr", выполнив:

stuff = [arr retain];

Но поскольку вы определили свойство, вы, очевидно, ХОТИТЕ использовать точечный синтаксис и вызов функции сохранения.

5
ответ дан 8 December 2019 в 16:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: