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代表无值,非空指针指向的内存空间存储实际参数值,和你示例代码的写法完全匹配。
- 针对 Objective-C 对象类型,通过
示例方法的实参传递方式
针对你给出的方法声明:
- (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
相关产品推荐
相关产品推荐

