当前位置: 首页 > news >正文

【Objective-C】04-第一个OC程序解析

 

 

说明:这个Objective-C专题,是学习iOS开发的前奏,也为了让有面向对象语言开发经验的程序员,能够快速上手Objective-C。如果你还没有编程经验,或者对Objective-C、iOS开发不感兴趣,请忽略。学习本专题之前,建议先学习C语言专题。

在上一讲,已经新建了第一个OC程序,这讲就来解析它内部的代码。

查看项目结构可以发现这个程序中只有一个源文件:main.m

打开main.m文件,代码如下

复制代码
 1 #import <Foundation/Foundation.h>
 2 
 3 int main(int argc, const char * argv[])
 4 {
 5 
 6     @autoreleasepool {
 7         
 8         // insert code here...
 9         NSLog(@"Hello, World!");
10         
11     }
12     return 0;
13 }
复制代码

1.程序的入口点:main函数

跟C程序一样,OC程序的入口点依然是main函数。在main.m的第3行已定义了一个main函数。

 

2.@autoreleasepool

在Java中,有垃圾回收机制,系统会自动回收不再使用的对象;而OC是不支持垃圾回收的,需要开发人员编写代码来释放对象所占用的内存。在第6行有个@autoreleasepool{},这是跟内存管理有关的,暂时不用理解它的意思,你只需要记住:以后的OC代码都写在@autoreleasepool的{}内部。

 

3.NSLog

1> 第9行的NSLog是一个日志输出函数,它可以将传入的OC字符串参数输出到控制台上。

2> 函数参数@"Hello, Wolrd!"是一个OC字符串,并不是C语言字符串,所有OC字符串的前面都有个@。

3> 第9行代码NSLog(@"Hello, World!");的输出结果是:

红框左边的信息是NSLog自动加上去的,比如日志输出时间、项目名称等。而且NSLog输出完毕后自动换行。

4> NSLog也可以像C语言的printf函数一样支持格式符

1 int age = 10;
2 NSLog(@"My age is %i and height is %.2f", age, 1.55f);

* %i表示接收整型数据

* %f表示接收浮点型数据,%.2f表示保留2位小数

* 输出结果:

2013-04-06 17:43:07.380 第一个OC程序[693:303] My age is 10 and height is 1.55

 

4.#import

1> #import是一个预处理指令,作用跟C语言的#include类似,都是 包含(拷贝)某个文件的内容 到 预处理指令所在的位置。

2> 第1行的#import <Foundation/Foundation.h>表示包含Foundation框架中的Foundation.h文件。

1) Foundation框架中包含了很多常用的类和函数,比如字符串处理类NSString、日志输出函数NSLog。它的重要程度相当于Java中的java.lang.*

2) Foundation框架和Foundation.h文件的位置:

3> 我在C语言专题的第三讲说过:.h称为头文件,一般用来声明一些函数,想要使用这些函数,就必须用#include包含函数所在的头文件。我们在第9行中使用的NSLog函数存在于Foundation.h文件中,因此要先包含Foundation.h文件才能使用NSLog函数。就好像在Java中,你用import关键字引入一个类后才能正常使用这个类。

4> 在C\C++中,我们用#include来包含头文件,缺点就是同一个头文件可能被包含多次。为了解决这个问题,一般会这样写头文件:

#ifndef _TEST_H_
#define _TEST_H_

/*.....*/

#endif

我们在OC中,就使用#import来包含头文件,优点是可以自动防止同一个头文件被包含多次。

5> #import <...>表示包含系统自带的文件,#import "..."表示包含开发人员自己创建的文件

相关文章:

  • Python哲学
  • linux ntp时间同步服务器搭建
  • 第二次冲刺阶段04
  • nodejs remote链接mysql数据库总结
  • 网站日志分析工具:WebLog Expert Lite
  • 微信查询高考分数已支持20个城市
  • ubuntu图形界面调出命令行
  • bootstrap常用类
  • Activity的生命周期【翻译】
  • 在web.xml中classpath和classpath*的区别
  • Python day two
  • ubuntu下搭建主/备RabbitMQ集群
  • JSP错误页面的处理和exception对象
  • AVL树相关操作
  • Linux有问必答:Linux上如何查看某个进程的线程
  • 【comparator, comparable】小总结
  • 2017届校招提前批面试回顾
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Angular4 模板式表单用法以及验证
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Javascript弹出层-初探
  • Magento 1.x 中文订单打印乱码
  • oschina
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 如何解决微信端直接跳WAP端
  • 微服务核心架构梳理
  • 一道面试题引发的“血案”
  • 与 ConTeXt MkIV 官方文档的接驳
  • 在Unity中实现一个简单的消息管理器
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • Android开发者必备:推荐一款助力开发的开源APP
  • C# - 为值类型重定义相等性
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • ​iOS安全加固方法及实现
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (02)Hive SQL编译成MapReduce任务的过程
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (3)nginx 配置(nginx.conf)
  • (poj1.3.2)1791(构造法模拟)
  • (分类)KNN算法- 参数调优
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (一)基于IDEA的JAVA基础1
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)重识new
  • (转载)(官方)UE4--图像编程----着色器开发
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • . NET自动找可写目录
  • .NET Core 中插件式开发实现
  • .NET 服务 ServiceController
  • .net 提取注释生成API文档 帮助文档
  • .net 中viewstate的原理和使用
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思