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]];