Чего я не понимаю, так это почему значения не хранятся с ключом (строка, число, что угодно) в качестве, ну, в общем, ключа, вместо того, чтобы создавать его хеш и хранить его.
Ну, как вы предлагаете сделать это, с помощью поиска O (1)?
Смысл хеш-таблиц в основном состоит в том, чтобы обеспечить поиск O (1) путем поворота ключ в индекс массива, а затем возвращает содержимое массива по этому индексу. Чтобы сделать это возможным для произвольных ключей, вам нужен
Вы правы, что после добавления в массив счетчик удержания равен 2. Однако вам следует беспокоиться только о счетах удержания, которые вы явно добавляете к элементу.
Сохранение объекта - это контракт, в котором говорится: «Я еще не закончил с тобой, не уходи». Основное практическое правило (есть исключения, но обычно они документированы) заключается в том, что вы владеете объектом, когда размещаете объект или создаете копию. Это означает, что вам предоставлен объект со счетчиком удержания 1 (не выпускается автоматически). В этих двух случаях вы должны отпустить его, когда закончите. Вдобавок, если вы когда-либо явно сохраняете объект, вы должны его освободить.
Итак, чтобы быть конкретным для вашего примера, когда вы создаете Person, у вас есть один счетчик удержания на нем. Правильно, если вы его создаете, вы должны его освободить. Если вы вкладываете в него проценты (через удержание), вы должны их освободить.
Счетчики сохраненных данных увеличиваются при специальном вызове 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];
}
Джош
Обычно вам следует / не беспокоиться о счетчике удержания. Это реализовано внутри компании. Вам следует заботиться только о том, хотите ли вы «владеть» объектом, сохранив его. В приведенном выше коде объект должен принадлежать массиву, а не вам (вне цикла у вас даже нет ссылки на него, кроме как через массив). Поскольку вы владеете [[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