有没有办法用无例外的风格来写 Objective-C ?

Is there a way to write Objective-C with no-exception style?

与 returning 值指示传统 C 函数中的错误不同,Objective-C 中的许多函数或方法可能会触发异常。例如,[NSString alloc] 如果 运行 内存不足将触发异常,而 malloc 将 return 一个表示失败的空指针。

有什么方法可以用这种无一例外的方式编写Objective-C代码吗?例如,当分配内存失败时,我可以使 [NSString alloc] return nil 而不是抛出异常吗?

没有。 Objective-C 假定在大多数情况下它不会 运行 内存不足,并且如果内存耗尽,则没有合理的方法来恢复并且程序应该中止。如果您有一个预计内存耗尽并且可以恢复的平台,那么您不应该使用 ObjC。

许多现代内核,包括 Darwin,都支持过度使用内存,所以即使是 malloc 也可能不会给你一个错误。在嵌入式平台之外,我们通常假设“小”(小于 1 兆字节)分配总是会成功。

https://serverfault.com/questions/852059/does-darwin-macos-kernel-do-memory-overcommit

关于其他断言失败的更普遍的问题,不。在 ObjC 中引发断言或抛出异常的事情被认为是编程错误,并且无法从中恢复。可以捕获 ObjC 异常,但即使是那些也无法恢复。在完成崩溃之前,您可以做一些工作。 (ObjC++中的规则略有不同,但一般答案是一样的。你无法避免各种崩溃。)