При каких обстоятельствах @finally нерезервированный в Обработке исключений попытки/выгоды/наконец Какао?

SimpleCursorAdapter adapter; adapter = new SimpleCursorAdapter( this, R.layout.activity_main, c, columns, views, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);

blockquote>

Вы определили макет своей основной деятельности как макет, который адаптер курсора будет использовать для создания внешнего вида каждого элемента в списке. https://developer.android.com/reference/android/widget/SimpleCursorAdapter.html#SimpleCursorAdapter (android.content.Context,% 20int,% 20android.database.Cursor,% 20java.lang.String [], % 20int [],% 20int)

Результат: кнопка и текстовые представления будут реплицироваться для каждого элемента в представлении списка. Ваша проблема не так проста, как две кнопки. Для каждого имеющегося у вас контакта будут созданы кнопка, представление списка и 2 просмотра текста, в то время как для каждого контакта вам потребуется только 2 просмотра текста.

Простое решение: создайте новый XML-файл, содержащий только текстовые представления, необходимые для отображения имени и идентификатора контакта, и предоставьте его адаптеру в качестве макета.

Список элементов списка:

//list_item.xml



    

    

Конструкция адаптера:

SimpleCursorAdapter adapter;
    adapter = new SimpleCursorAdapter(
            this, R.layout.list_item, c, columns, views,
            CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
9
задан Nick Forge 12 April 2009 в 10:09
поделиться

4 ответа

В том случае, когда вы подавляете исключение, нет. @finally используется для очистки, когда вы либо не перехватываете исключение, либо перебрасываете его, в любом случае оставляя окончательный ответ исключения на вызывающий код. Поскольку исключения в Какао, как предполагается, используются только для ошибок программирования и, следовательно, возникают редко, это вполне разумная вещь.

Стоит также указать на один случай, когда вам не нужно используйте @finally , когда вы устанавливаете свой собственный пул автоматического выпуска. Когда «родительский» пул автоматического выпуска будет уничтожен, все внутренние, которые еще не были очищены, также будут. Если вы попытаетесь очистить его самостоятельно, вам нужно добавить исключение из пула авто-релизов.

5
ответ дан 4 December 2019 в 07:48
поделиться

В этих сценариях нет никакой разницы, потому что исключение проглочено. Вот два сценария, в которых является разницей:

[obj cleanUp] называется:

MyClass *obj;
@try {
    [obj doSomething];
}
@catch (NSException * e) {
    @throw;      
}
@finally {
    [obj cleanUp]; // called when exception is caught
}

[obj cleanUp] не вызывается:

MyClass *obj;
@try {
    [obj doSomething];
}
@catch (NSException * e) {
    @throw;
}
[obj cleanUp]; // not called when exception is caught
15
ответ дан 4 December 2019 в 07:48
поделиться

When:

  • You are not catching the type of exception that occured
  • You caught the exception, but the code in the catch block also throws an exception.
1
ответ дан 4 December 2019 в 07:48
поделиться

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

Широко используется подход try / catch / finally в Java, но вряд ли когда-либо использовался в Objective-C и не является предпочтительным подходом - он вам просто не нужен, поскольку библиотеки не будут генерировать исключения, как вызовы библиотек Java, и если вы пишете свои собственные библиотеки, вы не должны ожидать вызывающих естественным образом подумает, что нужно искать исключения для перехвата.

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

0
ответ дан 4 December 2019 в 07:48
поделиться