Ответ 1
Вы полностью можете. Единственное, что вы делаете неправильно, это думать, что параметры метода индексируются 0, когда на самом деле они являются 1-индексированными (oh и it nonnull
, not nonnil
):
- (void)doSomethingWithRequiredString:(NSString *)requiredString
bar:(NSString *)optionalString
__attribute((nonnull(1)));
Теперь, когда вы пытаетесь использовать это:
id thing = ...;
[thing doSomethingWithRequiredString:nil bar:@"42"];
Xcode предупредит вас, говоря: "Нуль передан вызываемому абоненту, который требует непустого аргумента".
Кроме того, если вы не учитываете "(1)" часть атрибута __, он предполагает, что требование не-nil применяется ко всем параметрам.
Clang распознает атрибуты GCC, а определение GCC атрибута nonnull
находится здесь: http://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/Function-Attributes.html#index-g_t_0040code_007bnonnull_007d-function-attribute-1733
Обновление: с Xcode 6.3 поддерживается более чистый синтаксис.
В свойствах и методах ключевые слова: nullable
, nonnull
и null_unspecified
.
Итак, ваша подпись метода станет таковой:
- (void)doSomethingWithRequiredString:(nonnull NSString *)requiredString
bar:(nullable NSString *)optionalString;