iOS修行---nonnull,nullable修饰

本文介绍了iOS开发中nonnull和nullable修饰符的使用方法。nonnull确保属性不会被赋值为nil,而nullable允许属性为空。此外,还展示了如何通过宏NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END来批量设置属性的非空特性。

                      iOS修行---nonnull,nullable修饰

@property(nonatomic,strong,nonnull) NSString *n1;
@property(nonatomic,strong,nullable) NSString *n2;
-(NSString *)test:(nullable NSString *)n3;
简单理解,就是经过nonull修饰的n1不能被赋予nil,而nullable修饰的n2是可以为空的,如:

n1 = nil;这样Xcode是会warning的,而,n2 = nil;是可以滴

也可以如下,利用宏来大范围指定

NS_ASSUME_NONNULL_BEGIN

@property(nonatomic,strong) NSString *n1;
@property(nonatomic,strong,nullable) NSString *n2;
-(NSString *)test:(NSString *)n3;

NS_ASSUME_NONNULL_END

这样在BEGIN和END范围内的,都会被赋予nonnull,但也可以显示的指定nullable,如上,n1和n3是nonnull的,但是n2时nullable


<think>我们面对的问题是在使用make编译时,遇到-Werror=nonnull选项导致编译失败的情况。用户希望在不检查-Werror=nonnull的情况下继续编译。根据引用内容,我们注意到有关于编译选项的警告和错误处理(引用[2]提到了-Wmissing-declarations,引用[4]提到了未初始化变量的警告处理),以及引用[5]展示了一个通过修改代码来解决编译错误的例子。解决方案思路:1.理解-Werror=nonnull:该选项将属性检查的警告视为错误。当函数参数标记为nonnull)但实际上可能传入指针时,编译器会报错。2.用户希望忽略这个检查,即让make过程中不将nonnull警告视为错误。方法:-方法一:修改编译选项(推荐)在make命令中去除-Werror=nonnull选项,或者将-Werror=nonnull替换为-Wno-error=nonnull(这样nonnull警告不会导致错误,但会显示警告)或-Wno-nonnull(完全不显示nonnull警告)。具体步骤:a.找到Makefile中设置编译选项的位置(通常是CFLAGS或类似的变量)。b.修改该变量,去掉-Werror=nonnull,或者替换为-Wno-error=nonnull-Wno-nonnull。例如,原CFLAGS可能为:```makefileCFLAGS=-Wall-Werror=nonnull-O2```修改为:```makefileCFLAGS=-Wall-Wno-error=nonnull-O2```或者```makefileCFLAGS=-Wall-Wno-nonnull-O2```-方法二:临时在命令行中覆盖编译选项在运行make时,通过命令行参数覆盖CFLAGS(或其他相关变量):```bashmakeCFLAGS="-Wall-O2-Wno-error=nonnull"```-方法三:修改代码(如果适用)如果代码中确实存在参数传入指针的风险,且这是有意为之,那么可以在调用函数前确保参数不为,或者使用条件判断。但是,根据用户描述,他们希望不检查,所以修改编译选项更直接。注意:根据引用[5]的例子,有时修改代码可以避免警告,但这里用户明确要求不检查,所以方法一或二更合适。验证:修改后重新运行make,应该不再因为nonnull检查而报错。相关问题:1.如何解决其他类型的-Werror编译错误?2.在大型项目中如何批量管理编译警告选项?3.如何确保忽略特定警告后不影响代码质量?请根据实际情况选择合适的方法。如果无法修改Makefile,方法二(命令行覆盖)最为方便。</think>### 解决 `make` 忽略 `-Werror=nonnull` 警告的问题 #### 问题分析 当使用 `-Werror=nonnull` 编译选项时,编译器会将参数检查警告视为错误。但在某些情况下(如引用[4]的示例),编译器无法识别代码逻辑已确保参数,导致不必要的编译失败。 --- ### 解决方案 #### 方法 1:修改编译选项(推荐) 在 `Makefile` 中调整编译标志,保留警告但不视为错误: ```makefile # 原配置(会因警告中断编译) CFLAGS += -Werror=nonnull # 修改为(保留警告但允许编译继续) CFLAGS += -Wnonnull ``` #### 方法 2:代码级修复 针对编译器无法识别的逻辑场景(如引用[4]的switch-case),添加显式断言: ```c void example_func(char *param) { // 添加断言确保编译器识别条件 assert(param != NULL); // 需包含 <assert.h> // 原始代码逻辑 if (*param == 'A') { ... } } ``` #### 方法 3:局部禁用警告 在特定代码段禁用警告(GCC/Clang): ```c #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wnonnull" void safe_func(char *must_be_nonnull) { // 此区域忽略nonnull警告 } #pragma GCC diagnostic pop ``` #### 方法 4:条件编译 针对不同编译器特性处理: ```c #if defined(__GNUC__) && __GNUC__ >= 8 __attribute__((nonnull(1))) #endif void api_func(void *required_ptr); ``` --- ### 验证步骤 1. 修改后运行编译: ```bash make clean && make ``` 2. 检查输出中是否包含 `nonnull` 警告但不中断: ``` warning: argument 1 null where non-null expected [-Wnonnull] ``` 3. 确认最终二进制文件生成成功 --- ### 技术原理 1. **`-Wnonnull` vs `-Werror=nonnull`** - `-Wnonnull`:仅显示警告(默认) - `-Werror=nonnull`:将警告升级为错误(引用[2]类似机制) 2. 编译器局限 如引用[4]所示,编译器无法完全推导复杂逻辑分支中的条件,需开发者辅助声明。 3. 安全平衡 建议保留 `-Wnonnull` 警告但不禁用,既可捕获真实错误,又避免过度严格中断。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值