Что за инициализация это называется - концептуальная?
У меня есть этот фрагмент из примера кода Apple "LazyTableImages" . В приведенном ниже коде они инициализируют класс IconDownloader. Так что же это за поведение?
*************************This Line ******************************************
IconDownloader *iconDownloader = [imageDownloadsInProgress objectForKey:indexPath];
**************************************************************************
а потом
if (iconDownloader == nil)
{
iconDownloader = [[IconDownloader alloc] init];
iconDownloader.CustomObject = CustomObject;
iconDownloader.indexPathInTableView = indexPath;
iconDownloader.delegate = self;
[imageDownloadsInProgress setObject:iconDownloader forKey:indexPath];
[iconDownloader startDownload];
[iconDownloader release];
}
и objectForKey docs говорит это:
objectForKey:
Возвращает значение, связанное с данным ключом.
- (id)objectForKey:(id)aKey
Parameters
aKey
The key for which to return the corresponding value.
Return Value
The value associated with aKey, or nil if no value is associated with aKey.
Availability
* Available in iPhone OS 2.0 and later.
Так что я должен верить, что они устанавливают эту линию
IconDownloader *iconDownloader = [imageDownloadsInProgress objectForKey:indexPath];
просто для установки значения nil в объекте.
в конечном итоге вопрос в том, что делает приведенная выше строка?
Спасибо
2 ответа
Эта строка:
IconDownloader *iconDownloader = [imageDownloadsInProgress objectForKey:indexPath];
не делает новый iconDonwloader. Он просто просит объект imageDownloadsInProgress (который, как я полагаю, является NSDictionary?) Попытаться получить объект IconDownloader, который соответствует ключу indexPath - текущей строке таблицы.
Этот бит кода:
if (iconDownloader == nil)
{
iconDownloader = [[IconDownloader alloc] init];
iconDownloader.CustomObject = CustomObject;
iconDownloader.indexPathInTableView = indexPath;
iconDownloader.delegate = self;
[imageDownloadsInProgress setObject:iconDownloader forKey:indexPath];
[iconDownloader startDownload];
[iconDownloader release];
}
проверяет, существует ли он Если это не так (imageDownloadsInProgress вернул ноль, т.е. не может найти объект для этого ключа), создайте новый и добавьте его в NSDictionary imageDownloadsInProgress.
Весь этот код означает, что для каждого indexPath (каждой строки в таблице) существует только один объект IconDownloader - он останавливал попытку загрузки значка более одного раза при прокрутке таблицы вверх и вниз.
Надеюсь, это поможет.
imageDownloadsInProgress представляется NSMutableDictionary. Этот словарь используется для хранения экземпляров класса IconDownloader. Экземпляры хранятся в соответствующем indexPath, поэтому легко получить IconDownloader для данной строки в tableView.
Строка, о которой вы спрашиваете, просто делает это. Он извлекает экземпляр IconDownloader для заданного indexPath или nil, если IconDownloader не был создан и сохранен в словаре ранее.