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

Objective-C++中Optional结构体参数用法及CGSize指针构造方法

Objective-C++ 中对应 C++ std::optional 的实现机制

Objective-C++ 同时兼容 Objective-C 和 C++ 双语法体系,可选值的实现分两种场景对应:

  • 纯 C++ 代码逻辑域:直接使用 C17 标准引入的std::optional即可,.mm 编译环境下无需做特殊适配,支持包括 Objective-C 基础结构体(如CGSize、CGRect)、C 自定义类型在内的任意值类型封装,语义和纯 C++ 环境完全一致。
  • Objective-C 方法/对象交互域:没有通用的原生可选值封装,按类型区分实现:
    • 针对 Objective-C 对象类型,通过nullable/nonnull注解标记可选性,nil即代表无值,语义和std::optional的空状态对齐。
    • 针对CGSize这类栈上值类型,原生约定就是用nullable 类型指针实现可选语义:nil代表无值,非空指针指向的内存空间存储实际参数值,和你示例代码的写法完全匹配。
示例方法的实参传递方式

针对你给出的方法声明:

- (void)foo:(CGSize)first
     second:(nullable CGSize*)second;

传参规则非常明确:

  • 不需要传second值时,直接传入nil即可。
  • 需要传有效CGSize值时,不能直接对临时右值取地址(比如&CGSizeMake(100,200)属于非法写法),需要先声明生命周期覆盖方法调用全程的局部变量,再传入变量地址,参考代码:
// 传入有效second参数
CGSize validSecondSize = CGSizeMake(200, 300);
[self foo:CGSizeMake(100, 100) second:&validSecondSize];

// 省略second参数
[self foo:CGSizeMake(100, 100) second:nil];

注意:这种指针传参的方式和std::optional持有值内存的逻辑有差异,你需要保证传入的指针指向的内存,在foo方法执行期间始终有效,不要在方法内保存传入的指针长期使用,避免栈变量回收触发野指针问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 13:19:07