Внутри каждого метода Objective-c есть две скрытые переменные id self
и SEL _cmd
так
- (void)foo:(id)bar;
действительно
void foo(id self, SEL _cmd, id bar) { ... }
и когда вы звоните
[someObject foo:@"hello world"]
это на самом деле
foo( someObject, @selector(foo), @"hello world")
Если вы щелкните cmd на NSAssert, чтобы перейти к его определению, вы увидите, что это макрос, использующий скрытую переменную _cmd метода, из которого вы вызываете его. Это означает, что если вы не находитесь внутри метода Objective-c (возможно, вы находитесь в 'main'), поэтому у вас нет аргумента _cmd, вы не можете использовать NSAssert.
Вместо этого вы можете использовать альтернативный NSCAssert.