Что увеличивается, объект сохраняют количество?

Чего я не понимаю, так это почему значения не хранятся с ключом (строка, число, что угодно) в качестве, ну, в общем, ключа, вместо того, чтобы создавать его хеш и хранить его.

Ну, как вы предлагаете сделать это, с помощью поиска O (1)?

Смысл хеш-таблиц в основном состоит в том, чтобы обеспечить поиск O (1) путем поворота ключ в индекс массива, а затем возвращает содержимое массива по этому индексу. Чтобы сделать это возможным для произвольных ключей, вам нужен

  1. Способ превратить ключ в индекс массива (такова цель хэша)
  2. Способ справиться с коллизиями (ключи, которые иметь одинаковый хэш-код)
  3. Способ регулировки размера массива, когда он слишком мал (вызывает слишком много коллизий) или слишком велик (тратит место)
13
задан Thomas R 25 July 2009 в 03:28
поделиться

3 ответа

Вы правы, что после добавления в массив счетчик удержания равен 2. Однако вам следует беспокоиться только о счетах удержания, которые вы явно добавляете к элементу.

Сохранение объекта - это контракт, в котором говорится: «Я еще не закончил с тобой, не уходи». Основное практическое правило (есть исключения, но обычно они документированы) заключается в том, что вы владеете объектом, когда размещаете объект или создаете копию. Это означает, что вам предоставлен объект со счетчиком удержания 1 (не выпускается автоматически). В этих двух случаях вы должны отпустить его, когда закончите. Вдобавок, если вы когда-либо явно сохраняете объект, вы должны его освободить.

Итак, чтобы быть конкретным для вашего примера, когда вы создаете Person, у вас есть один счетчик удержания на нем. Правильно, если вы его создаете, вы должны его освободить. Если вы вкладываете в него проценты (через удержание), вы должны их освободить.

18
ответ дан 1 December 2019 в 21:53
поделиться

Счетчики сохраненных данных увеличиваются при специальном вызове alloc, поэтому вам нужно освободить это явно.

фабричные методы обычно дают вам автоматически выпущенный объект (такой как [NSMutableArray array] - вам нужно будет специально сохранить его, чтобы сохранить его в течение любого периода времени.).

Что касается NSArray и NSMutableArray addObject :, кто-то другой должен будет прокомментировать. Я считаю, что вы относитесь к классам как к черным ящикам с точки зрения того, как они обрабатывают собственное управление памятью в качестве шаблона проектирования, поэтому вы никогда не выпустите явно то, что вы передали в NSArray. Когда он уничтожается, предполагается, что он сам будет обрабатывать уменьшение счетчика сохранения.

Вы также можете получить несколько неявное сохранение, если объявите свои ivars как свойства, такие как @property (keep) suchAndSuchIvar, и используйте @synthesize в своей реализации. Synthesize в основном создает для вас сеттеры и геттеры, и если вы вызываете (сохраняете) специально, сеттер сохранит переданный ему объект. Это не всегда сразу очевидно, потому что сеттеры могут быть структурированы следующим образом:

Person fart = [[Person alloc] init];
fart.firstName = @"Josh"; // this is actually a setter, not accessing the ivar
                          // equivalent to [fart setFirstName: @"Josh"], such that
                          // retainCount++

Edit:

А что касается управления памятью, как только вы добавляете объект в массив, все готово .. . итак:

   for (i = 0; i < 10; i++) {
       Person *p = [[Person alloc] init];
       [array addObject:p];
       [p release];
   }

Джош

4
ответ дан 1 December 2019 в 21:53
поделиться

Обычно вам следует / не беспокоиться о счетчике удержания. Это реализовано внутри компании. Вам следует заботиться только о том, хотите ли вы «владеть» объектом, сохранив его. В приведенном выше коде объект должен принадлежать массиву, а не вам (вне цикла у вас даже нет ссылки на него, кроме как через массив). Поскольку вы владеете [[Person alloc] init] , вы должны освободить его.

Таким образом,

Person *p = [[Person alloc] init];
[array addObject:p];
[p release];

Кроме того, вызывающий "getPeople" не должен владеть массивом. Это условность. Вы должны сначала выпустить его автоматически.

NSMutableArray *array = [[[NSMutableArray alloc] init] autorelease];

Вы захотите прочитать документацию Apple по управлению памятью: http://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

2
ответ дан 1 December 2019 в 21:53
поделиться
Другие вопросы по тегам:

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