oc-基本语法
一、第一个oc程序
1 2 3 4 5 6 7 | #import <Foundation/Foundation.h> int main( int argc, const char * argv[]) { NSLog(@ "Hello, Objective-C" ); return 0; } |
运行,控制台输出
二、声明变量使用类型关键字(int/float/long/BOOL/char等)
1 2 3 4 5 6 7 8 | #import <Foundation/Foundation.h> int main( int argc, const char * argv[]) { int num = 100; NSLog(@ "Number is: %i" , num); return 0; } |
运行,控制台输出
JS中声明变量只用var,无论何种数据类型。
三、块级作用域
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #import <Foundation/Foundation.h> int main( int argc, const char * argv[]) { int num = 100; if (num > 99) { int secondNum = 200; NSLog(@ "Number is: %i" , num); NSLog(@ "Number is: %i" , secondNum); } NSLog(@ "Number is: %i" , num); NSLog(@ "Number is: %i" , secondNum); // 错误,编译器会提示 return 0; } |
JS中没有块级作用域。
四、static关键字
前面的局部变量通常都在每次程序进入该局部变量的作用域时分配并在离开时释放。这类存储称为自动存储(默认关键字auto)。
static关键字会在声明变量的时候分配内存,在程序运行期间只分配一次内存。之后再访问时,实际都是在访问原先分配的内存。这适合用于存储创建时使用大量的资源,并且不常改变的局部变量。
1 2 3 4 5 6 7 8 9 10 | void func() { static Expensive * p = [[Expensive alloc] init]; [p doSomeOp]; } int main( int argc, const char * argv[]) { func(); // 第一次调用时创建 p func(); // 第二次调用,此时p已存在,不会再次创建 return 0; } |
因为全局变量默认位于全局作用域中,所以其行为和静态变量一样。也就是说,它们只分配一次内存,并在整个程序运行期间保持不变。
JS中,未在function内声明的或未使用var声明的变量都是全局变量。
五、const关键字
const同样会修改所声明变量的内存行为,它所修饰的变量是只读的,即第一次初始化后它的值将不能改变。通常用来声明常量。
1 2 3 4 5 6 7 8 9 | #import <Foundation/Foundation.h> int main( int argc, const char * argv[]) { const NSString *str = @ "BeiJing" ; str = @ "ShangHai" ; // 会产生一个编译错误 NSLog(@ "dd, %@" , str); return 0; } |
JS规范ES6中也增加了const关键字,Firefox/Chrome/Safari的最新版已经支持。node v0.8+ 也支持。
六、结构体
结构体算是一种复合数据类型,对象也是。复合数据类型由基本类型组成。定义结构体使用struct关键字
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #import <Foundation/Foundation.h> int main( int argc, const char * argv[]) { // 定义一个结构体 struct Point { int x; int y; }; // 使用结构体类型 struct Point p1; struct Point p2; // 赋值使用点操作符 p1.x = 0; p1.y = 0; p2.x = 1; p2.y = 1; // 假设有个写好的函数moveFromTo moveFromTo(p1, p2); // 从坐标中心点移动到(1,1)点 return 0; } |
JS没有所谓的结构体,但这里的点操作符类似与JS对象取属性操作符。OC对象调用时却不是使用点操作符。
七、类型定义 typedef (type definition)
结构体每次使用时都需要输入struct Point,很无聊。typedef则省去了该步骤,更简洁。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #import <Foundation/Foundation.h> int main( int argc, const char * argv[]) { // 定义一个类型 typedef struct { int x; int y; } Point; // 使用类型, 省去了struct Point p1; Point p2; // 赋值使用点操作符 p1.x = 0; p1.y = 0; p2.x = 1; p2.y = 1; // 假设有个写好的函数moveFromTo moveFromTo(p1, p2); // 从坐标中心点移动到(1,1)点 return 0; } |
这里,Point变为了“一等类型”,和int一样在任何地方都可以用。注意,和struct一样定义的是纯数据类型,没有操作(方法)。
JS没有typedef(倒是有一个typeof), JS的function可以来定义一个纯数据(this, prototype挂基本类型)。
八、
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
2011-09-21 ajax后退解决方案(五)