乐宁工具

Objective-C 运算符对照表

免费使用 超详细版 可复制

Objective-C 基于 C 语言运算符体系,并扩展了对象消息语法 []、@ 字面量、点语法、属性等 OC 特色语法。本表涵盖算术、关系、逻辑、位运算、指针、赋值、消息、@ 关键字、内存管理、优先级等全部内容。

分类运算符名称示例代码结果说明 / 注意事项
算术运算符
+加法int a = 3 + 2; // 5也可字符串化(C 层面无字符串拼接)
-减法int a = 5 - 3; // 2
*乘法int a = 4 * 3; // 12
/除法7 / 3; // 2整数除法截断;浮点除法保留小数
%取模7 % 3; // 1结果符号与被除数相同
++自增int a=5; a++; // 6前缀先加后用,后缀先用后加
--自减int a=5; a--; // 4
关系运算符
==等于5 == 5 // YES(true)OC 中 BOOL 实质是 signed char;YES=1 NO=0
!=不等于5 != 3 // YES
>大于5 > 3 // YES
<小于3 < 5 // YES
>=大于等于5 >= 5 // YES
<=小于等于3 <= 5 // YES
逻辑运算符
&&逻辑与(短路)YES && NO // NO左为 NO 时右不求值
||逻辑或(短路)YES || NO // YES左为 YES 时右不求值
!逻辑非!YES // NO
位运算符
&按位与5 & 3 // 10101 & 0011 = 0001
|按位或5 | 3 // 7
^按位异或5 ^ 3 // 6
~按位取反~5 // -6补码表示
<<左移5 << 1 // 10左移n位 = 乘以2^n
>>右移-8 >> 1 // -4算术右移(保留符号)
赋值运算符
=赋值int a = 10;
+= -= *= /= %=复合赋值a += 3; // a=a+3
&= |= ^= <<= >>=位运算赋值a &= 3;
指针运算符
&取地址int *p = &a;获取变量地址
*解引用int v = *p;访问指针指向的值;空指针解引用崩溃
->成员访问p->name等价于 (*p).name
[]下标arr[0] = 10;可重载(C++ 中);OC 数组用 objectAtIndex:
消息语法
[]消息发送[obj method];OC 最核心语法:向对象发消息
[]带参数[obj setName:@"Tom"];多参数:[obj setX:1 y:2];
[]嵌套消息[[NSString alloc] init];从内向外执行
[class alloc]创建对象MyClass *o = [[MyClass alloc] init];alloc 分配内存,init 初始化
点语法
.属性访问obj.name = @"Tom";本质是调用 setName: / name 方法
.链式person.address.city本质是一系列 getter 调用
@ 字面量
@"..."NSString 字面量NSString *s = @"hello";OC 特有,比 [NSString stringWithUTF8String:] 简洁
@[]NSArray 字面量NSArray *a = @[@1, @2, @3];元素必须是对象
@{}NSDictionary 字面量@{@"key": @"value"}键和值都必须是对象
@()NSNumber 装箱NSNumber *n = @42;基本类型自动装箱
@ 关键字
@selector方法选择器SEL s = @selector(doSomething:);运行时动态调用
@protocol协议声明@protocol MyProtocol ... @end类似 Java 的 interface
@class前向声明@class MyClass;头文件中减少依赖
@property属性声明@property (nonatomic, strong) NSString *name;自动生成 getter/setter
@synthesize / @dynamic属性实现@synthesize name=_name;@dynamic 告诉编译器运行时提供
类型运算符
(TypeName)C 风格强转int a = (int)3.14; // 3不推荐用于对象间转换
id动态类型id obj = [[MyClass alloc] init];任意 OC 对象指针
instancetype关联返回类型-(instancetype)init;比 id 更安全,编译器能推断类型
内存管理
retain / releaseMRC 引用计数[obj retain]; [obj release];ARC 下由编译器自动插入
autorelease延迟释放[obj autorelease];ARC 下仍可用但由编译器管理
__strong / __weakARC 所有权__weak typeof(self) wself = self;__weak 避免循环引用
特殊
?:三元a>b?a:b可嵌套
,逗号a=1, b=2, a+b // 3返回最后一个表达式的值
优先级(高→低)
[] () . ->消息/调用/成员[obj method] / p->x最高
++ -- * & + - ! ~单目前缀!flag / ~a / *p
* / %乘除模a*b/c
+ -加减a+b
<< >>位移
< <= > >=关系a>b
== !=相等a==b
&按位与
^按位异或
|按位或
&&逻辑与
||逻辑或
?:三元右结合
优先级(最低)
= += 等赋值从右向左

Objective-C 运算符注意事项

  • • OC 的 BOOL 本质是 signed char,YES=1,NO=0;非零值不一定是 YES
  • == 比较指针地址(对象)或值(基本类型);对象内容比较用 isEqual:
  • [] 在 OC 中是消息发送语法(不是数组下标):[obj method]
  • • 点语法 obj.name 本质是调用 name / setName: 方法,不是直接访问 ivar
  • @"..." 创建编译期 NSString 常量,@[] @{} @() 是字面量语法(LLVM 4.0+)
  • • ARC 下 retain/release/autorelease 禁止手动调用,由编译器自动插入
  • __weak 引用在对象释放后自动置 nil,是打破循环引用的关键
  • instancetypeid 更安全,编译器能做类型检查
  • @selector() 在编译期检查选择器是否存在,运行时动态调用

[] 消息语法

OC 核心:[obj method] 向对象发消息,运行时动态派发

@ 字面量

@"..." @[] @{} @() 简洁创建 OC 对象,避免冗长方法调用

ARC 内存

__strong 默认;__weak 打破循环引用;__unsafe_unretained 不置nil

点语法本质

obj.name 调用 getter/setter,不是直接访问成员变量