You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么[[NSNumber alloc] init]返回nil,且不将init、new标记为NS_UNAVAILABLE?

[[NSNumber alloc] init]返回nil的原因

NSNumber是典型的类簇实现,你调用[NSNumber alloc]时,得到的只是NSNumber抽象子类的占位实例,并非最终可用的实体实例。NSNumber本身覆写了继承自NSObject的init方法,因为NSNumber必须绑定一个具体的数值类型和值才有意义,默认init没有对应的默认值可以承载,所以苹果的实现中直接在这个方法内返回nil,没有沿用NSObject默认返回self的逻辑。

关于__NSCFNumber的初始化逻辑

你提到的__NSCFNumber是NSNumber类簇对应的私有实体子类,所有合法的指定初始化器(比如initWithInt:、initWithBool:、initWithFloat:等)内部都会完成类型匹配,生成对应的__NSCFNumber实例再返回,部分常用小数值还会直接指向系统预缓存的常量实例,不会额外申请内存。
你猜测的“默认init调用时底层__NSCFNumber为nil才返回nil”逻辑是颠倒的:是init方法本身完全没有走生成__NSCFNumber实例的流程,主动返回了nil,并非底层生成实例失败才返回nil。

苹果不把init、new标记为NS_UNAVAILABLE的原因

核心是向后兼容需求:

  • 早期iOS/OS X版本中,存在不少第三方代码误用[NSNumber new]或者[[NSNumber alloc] init]的写法,如果现在直接将这两个方法标记为不可用,会导致大量老项目无法正常编译,不符合苹果的向后兼容策略
  • NSNumber继承自NSObject,init、new是NSObject的基础方法,苹果在类簇的设计中更倾向于通过运行时返回nil的方式提醒开发者调用错误,而不是在编译期强制拦截,避免破坏类簇本身的继承体系设计

内容的提问来源于stack exchange,提问作者Wayne Xiong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 08:45:08