Xcode 7, Obj-C, "Null передан вызываемому абоненту, для которого требуется непустой аргумент"
В Xcode 7 я получаю это предупреждение:
Null passed to a callee that requires a non-null argument
.. из этой инициализации nil NSMutableArray...
sectionTitles = [[NSMutableArray alloc] initWithObjects:nil];
Я обнаружил, что вместо этого я должен использовать removeAllObjects
.
[sectionTitles removeAllObjects];
Однако это не позволяет оценить a sectionTitles.count == 0
. Я попробовал sectionTitles == nil
, однако, если я не использую iniWithObjects
, я не могу добавлять объекты позже.
Мне нужно установить массив на нуль или ноль, когда я обновляю свой источник данных, когда нет записей. Кажется, я не могу использовать addObject
для добавления элементов, если не использовал initWithObjects
.
Ответы
Ответ 1
Почему бы вам не попробовать:
sectionTitles = [[NSMutableArray alloc] init];
или любое из следующего:
sectionTitles = [[NSMutableArray alloc] initWithCapacity:sectionTitles.count];
sectionTitles = [NSMutableArray new];
sectionTitles = [NSMutableArray array];
sectionTitles = [NSMutableArray arrayWithCapacity:sectionTitles.count];
возможно, некоторые глупые:
sectionTitles = [NSMutableArray arrayWithArray:@[]];
sectionTitles = [@[] mutableCopy];
Существует множество способов создания пустых изменяемых массивов. Просто прочитайте doc.
Ответ 2
Передача ненулевых параметров является лишь отчасти ответом.
Новые аннотации нулевых ошибок Objective-C имеют огромные преимущества для кода на стороне Swift забора, но там существенный выигрыш здесь даже без написания строки Swift. Указатели, отмеченные как nonnull
, теперь дают подсказку во время автозаполнения и выдают предупреждение, если отправлено нуль вместо правильного указателя.
Прочитайте полную версию статьи NSHipster .
Чтобы воспользоваться одним и тем же контрактом в своем собственном коде, используйте nonnull
или nullable
:
Obj-C
- (nullable Photo *)photoForLocation:(nonnull Location *)location
Ответ 3
Получена такая же ошибка при инициализации NSMutableArray с нулями,
[[NSMutableArray alloc] initWithObjects:0, 0, 0, 0, 0, nil];
Изменено на
[NSMutableArray arrayWithArray:@[@0, @0, @0, @0, @0]];