iOS开发系列—Objective-C之基础概览

2023-10-30

概览

前面我们已经用了几章内容进行C语言介绍,当然要通过几篇文章完整的介绍C语言的知识是不太现实的,例如C语言的文件操作、内存申请等我们都没有重点介绍,当然核心知识点基本都已经提到了,后面有时间我们会继续扩充。今天我们正式开始学习Objective-C,以后简称“ObjC”,ObjC是在C语言的基础上加上了一层面向对象的特性,它完全兼容C语言,甚至可以混写C++。它是Mac OS X和IOS的主要开发语言,从IOS发布之后可以说ObjC的地位呈直线上升趋势,当前ObjC已经是仅次于C语言、Java的第三大编程语言。今天我们先简单的看一下C语言的一些基础内容:

  1. 第一个ObjC程序
  2. 基本数据类型

第一个ObjC程序

打开Xcode,创建一个新项目

Xcode

选择命令行程序

CommandLine

选择程序语言为Ojbective-C并输入项目名称

ProjectName

选择保存目录

SelectFolder

默认生成一个基本的项目结构

Program

程序源代码

//
//  main.m
//  Basics
//
//  Created by Kenshin Cui on 14-2-1.
//  Copyright (c) 2014年 Kenshin Cui. All rights reserved.
//

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World!");
    }
    return 0;
}

上面是通过Xcode创建的第一个ObjC程序,这是一个经典的“Hello,World!”。运行结果如下:

RunResult

下面对上面的代码做一下简单解释:

  1. 首先#import是一个导入命令,类似于C语言的#include命令,但是相对于#include而言,#import有效的处理了重复导入的问题,在C语言中也提到过如何通过条件编译解决重复导入,而在ObjC中你不需要处理了,#import已经自动进行了重复处理;与#include类似,导入系统类库使用<>,导入自定义类库使用””;
  2. Foundation.h是Foundation框架中的头文件,这是ObjC中的一个基础类库,基本上后面我们用到的所有ObjC的代码都需要引入这个类库;
  3. @autoreleasepool是ObjC的关键字,它的作用是对包含在这个关键字后面大包括内的程序会自动进行内存回收,不需要开发人员手动释放无用的对象;当然表面上看起来这有点类似于C#和Java的内存垃圾回收机制,但是事实上他们的原理完全不同,以后再做具体解释。
  4. NSLog是标准输出函数,类似于C语言中的printf()函数,但是它会自动换行,当然它同样支持格式输出(例如%i表示输出整形数据,%f输出浮点型数据),这个函数在Fundation.h中声明;
  5. @”Hello,World!”,是一个字符串常量,在ObjC中字符串前需要使用@符号;

 

扩展--OjbC语法特点

  • ObjC中没有命名空间(C#)或包(Java)的概念,那也就是说在同一个应用中不能同时存在两个完全相同的类名,通常情况下我们通过前缀加以区分,例如在ObjC中的NSString、NSLog中的NS就是前缀。

NS其实是NeXTSTEP缩写,是乔布斯离开苹果后在NeXT公司所开发的系统,这个操作系统在当时虽然没有获得广泛认同,但是却为后面Mac OX奠定了基础。

  • ObjC中很多关键字都是以@开头(例如@autoreleasepool、@interface、@protocol),另外需要注意的是为了区分C语言中的字符串,ObjC中的字符串也必须加上@。

基本数据类型

在ObjC中的基本数据类型除了C语言中的char、int、float、double之外还有:

  1. BOOL类型,包含两个值YES和NO,其实ObjC中的布尔类型就是整数1和0;
  2. id类型,是一个对象类型,可以表示所有对象;
  3. NSString是Fundation框架中定义的字符串类型;
//
//  main.m
//  Basics
//
//  Created by Kenshin Cui on 14-2-1.
//  Copyright (c) 2014年 Kenshin Cui. All rights reserved.
//

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        char a='a';
        int b=1;
        float c=8.5;
        double d=8.5e+12;
        char e='a';
        BOOL f=YES,g=NO;
        NSLog(@"a=%c,b=%i,c=%f,d=%f,e=%c,f=%i,g=%i",a,b,c,d,e,f,g);
        //结果:a=a,b=1,c=8.500000,d=8500000000000.000000,e=a,f=1,g=0
        
        NSString *str=@"Hello,World!";
        NSLog(@"str=%@",str); //结果:str=Hello,World!
        
        NSLog(@"object=%p",nil);//结果:object=0x0
    }
    return 0;
}

关于上面id类型在这里不做过多的解释,后面我们会专门说到,下面列出常用格式符:

格式化输出

 

注意

1.在C或者ObjC中整形可以使用%i也可以使用%d来格式化,只有使用scanf()输入的时候二者才有区别(由于%d始终被编译器解释为decimal intergeer所以即使输入010会被认为是整形10,而%i则会将前面的0或者0x认为此输入是八进制或十六进制整数);

2.%p本质就是输出指针地址,在32位编译器下对于一个指针类型使用%x输出和%p输出其实是一样的,只是后者会在前面加上“ox”(注意在64位编译器下由于指针长度8byte,而整形只有4byte所以%x输出的内容只是%p的低位数据);

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS开发系列—Objective-C之基础概览 的相关文章

  • Spring Security:如何在 FilterRegistrationBean 中使用多个 URL 模式?

    我有一颗豆子 Bean public FilterRegistrationBean animalsFilterRegistration FilterRegistrationBean registration new FilterRegist
  • 我可以为 Spring Boot 应用程序创建多个入口点吗?

    In 春季启动 需要指定一个主类 它是应用程序的入口点 通常 这是一个具有标准 main 方法的简单类 如下所示 SpringBootApplication public class MySpringApplication public s
  • Maven 配置文件相当于 Gradle

    我试图在我的 spring boot 项目构建中实现一个简单的场景 包括 排除依赖项以及根据环境打包 war 或 jar 例如 对于环境dev包括开发工具和包 jar 用于prod包战等 我知道它不再是基于 XML 的配置 我基本上可以在
  • java.lang.unsatisfiedlinkerror 无法加载 amd 64 位 .dll ia 32 位

    当我尝试在 Eclipse 上运行我的项目时 出现以下错误 它在我开发它的计算机上运行良好 但当我将其导入我的笔记本电脑时 它不起作用 这个问题已经在本网站的其他地方提出过 这个问题的主要原因似乎是环境变量设置不正确 但我检查过 它们似乎是
  • Java:BufferedReader readLine() 中的 IOEXception 有何用途?

    我可以使用 try catch 循环 修复 以下异常 但我无法理解原因 为什么 in readLine 部分会不断引发IOExceptions 抛出此类异常的真正目的是什么 目标可能不仅仅是更多副作用 代码和 IOException jav
  • 将json URL导入到java并使用jackson库解析它

    我正在尝试读取 java 中的 json 链接并解析它 以便我可以将它用于其他事务 但问题是我收到错误 我真的不知道该如何处理它们 这是代码 package weather data import weather data import c
  • 使 TreeMap 比较器容忍 null

    这个定制的 Valuecomarator 按其值对 TreeMap 进行排序 但在搜索 TreeMap 是否具有某个键时 它不能容忍 nullpointException 如何修改比较器来处理零点 import java io IOExce
  • 使用 Java NIO 直接访问 Windows 磁盘

    我正在使用一个使用 Java NIO 的库来直接将文件映射到内存 但我在直接读取磁盘时遇到问题 I can直接使用读取磁盘FileInputStream与 UNC 合作 例如 File disk new File PhysicalDrive
  • 在 Java 和 C 中在运行时调用名为“string”的方法

    我们如何调用名称为的方法string在运行时 谁能告诉我如何在 Java 和 C 中做到这一点 在java中可以通过反射api来完成 看一下Class getMethod String methodName Class parameterT
  • UiBinder 中的 gwt 按钮

    我需要创建一个按钮 所以它是一个带有图像的按钮 gwt with UiBinder 但我不确定如何进行 这是我的ui xml code
  • 在 Eclipse 中导航 Java 调用堆栈

    在调试器中像GDB http sources redhat com gdb 当您在断点处停止时 您可以轻松地向上移动调用堆栈并检查相关的源和堆栈帧数据 在 Eclipse 中如何做到这一点 In the 调试视角 http www ibm
  • 为什么我无法解开根节点并反序列化对象数组?

    为什么我无法通过展开根节点来反序列化对象数组 import java io IOException import java util Arrays import java util List import org codehaus jack
  • 如何在Android Studio中关联.mp3文件

    我想根据列表视图项单击播放 mp3 文件 但是根据我的代码 我运行我的应用程序 出现此窗口 因此由于缺少音频选项 我真的不知道需要选择其中哪一个为了关联我的 mp3 文件 mainList setOnItemClickListener ne
  • 如何更改tomcat jmx密码的文件权限

    我正在尝试保护 Windows 平台上托管的本地 tomcat 实例上的 JMX 访问 我已经创建了访问权限和密码文件 并使用以下 VM 参数插入这些文件 Dcom sun management jmxremote password fil
  • 为什么 Libgdx 的 Table 不接受缩放操作?

    我在 libgdx 库中使用 scene2d 在游戏中创建一些 UI 我使用了一个表格 我想在用户触摸时采取一些缩放操作以使按钮触摸有意义 当我使用任何其他 Actor 类型 例如 Group 并为其提供缩放操作时 它可以工作 但不能工作表
  • Java字符串中的字符数[重复]

    这个问题在这里已经有答案了 可能的重复 Java 使用unicode上划线显示平方根时字符串的长度 https stackoverflow com questions 7704426 java length of string when u
  • 如何根据服务器/环境动态加载服务器配置?

    目前 我设置了 Maven 配置文件 以便能够为不同的环境 开发 演示 暂存 生产等 部署我的项目 并且它工作得很好 但问题是 对于我拥有的每个模块 Web 应用程序 我需要复制 粘贴此配置文件 它们都是属性文件 当我需要更改环境 服务器配
  • bean 中的 Spring JavaConfig 属性未设置?

    我正在考虑将 Spring JavaConfig 与一些属性文件一起使用 但 bean 中的属性未设置 bean 中的属性未设置 这是我的网络配置 Configuration EnableWebMvc PropertySource valu
  • 警告:无法加载 sqljdbc_auth.dll 原因:java.library.path 中没有 sqljdbc_auth

    我正在使用 Ubuntu 12 05 并尝试连接到 Windows Server 2012 来获取数据库 我的数据库名称是 jobs 电脑的IP地址是192 160 1 33 托管在1433 但是当我尝试连接时出现以下错误 WARNING
  • 在私有 guice 模块中公开 Map

    我在 guice 中有一个 PrivateModule 我想从该模块公开一个 Map public class TestInjectionModule extends PrivateModule expose Map class annoa

随机推荐

  • 工控安全PLC固件逆向一

    在工控领域 我们会遇到许多协议 为了进行安全研究 经常需要对协议的具体内容进行探索 今天我们就来聊聊关于工控协议逆向的问题 接下来会简单介绍一下常用的协议逆向方法并配合一些实战 当然 从未知到已知的探索过程不仅仅需要代码上的实践 还需要数学
  • React - getSnapshotBeforeUpdate() 的使用

    getSnapshotBeforeUpdate 方法 1 在render之前调用 state已更新 2 典型场景 获取render之前的dom状态 我们来看一个例子 每一秒钟都会加入一个新的 div msg number div 假如我们使
  • 一次网络不通“争吵”引发的思考

    为啥争吵 吵什么 你到底在说什么啊 我K8s的ecs节点要访问clb的地址不通和本地网卡有什么关系 气愤语气都从电话那头传了过来 这时电话两端都沉默了 过了好一会传来地铁小姐姐甜美的播报声打断了刚刚的沉寂 乘坐地铁必须全程佩戴口罩 下一站西
  • 终止代码driver_irql_not_less_or_equal

    终止代码driver irql not less or equal McAfee和Zone Alarm是导致问题的原因 因此 我们建议卸载它们
  • Stable Diffusion web UI 安装、启动脚本、常见问题、插件(linux)

    Stable Diffusion本身是一个模型 对于大多数想试试的人来说 使用这个web ui版本最合适 建议先看完再动手 虽然不难但是有门槛 主要要解决网络问题 如果深入需要会python 如果只是想试试的 建议直接下载别人打好的包 自己
  • J2EE 高并发体系详解--HTTP Session 失效转移

    HTTP Session 失效转移 几乎所有流行的 J2EE 供应商都在他们的集群产品中实现了 Http Session 失效转移 用来保障当某台服务器失效后会话状态不会丢失 使客户端请求能被正确处理 如图 6 所示 当浏览器访问有状态的
  • 光学单位定义-照度 lux

    照度的单位 勒克斯 勒克斯 lux 法定符号lx 是照度 luminance 的单位 定义 在1平方米面积上所得的光通量是1流明时 它的照度是1勒克斯 照度是反映光照强度的一种物理量 其物理意义是照射到单位面积上的光通量 照度的单位是每平方
  • 1.2 PhalApi 运行Hello World

    运行Hello World 此文章假设你已成功安装PhalApi2项目 如果尚未安装 可阅读下载与安装 编写一个接口 在PhalApi 2 x 版本中 项目源代码放置在 path to PhalApi2 src目录中 里面各个命名空间对应一
  • PCL 改进快速欧式聚类

    目录 一 概述 二 代码实现 三 结果展示 一 概述 论文复现 FEC Fast Euclidean Clustering for Point Cloud Segmentation一文严格按照论文中描述的方法进行算法的复现 未添加点云聚类分
  • python多线程和多进程

    python多线程和多进程
  • Java中Thread类的基本使用

    Thread类的基本用法 1 创建子类 继承自Thread并且重写run方法 class MyThread extends Thread Override public void run System out println hello t
  • 用图讲解 ElasticSearch 搜索原理,你就明白了!

    来源 cnblogs com richaaaard p 5226334 html 文末提示 给大家准备好了ES相关资源 摘要 先自上而下 后自底向上的介绍ElasticSearch的底层工作原理 试图回答以下问题 为什么我的搜索 foo b
  • vue自定义指令/v-loading指令

    v loading指令
  • 跨界电商战略中的Socks5代理与数据采集

    一 跨界电商战略与数据采集的重要性 跨界电商战略旨在拓展市场 获取新机遇 但成功的战略制定离不开准确的市场情报和竞争数据支持 数据采集是了解市场需求 竞争态势的关键步骤 然而在全球范围内采集数据面临地理限制和网络封锁的问题 二 Socks5
  • 基于Tensorflow的MNIST机器学习经典案例的翻译

    说实话 对于学习 很久没有体会到对这种陷进去的感受了 现在是周六下午 我独自一人在空荡荡的办公室 而且昨天在办公室弄到快23 00 今早还是起来顶着高温到办公司10 00多 我做这些不是说加班 目的请看标题 学习一门语言一种数据库一种框架或
  • 如何在Ubuntu20.04上使用vscode编译运行和调试C/C++

    这里写自定义目录标题 一 安装visual stdio code 二 编译与运行 三 配置调试环境 一 安装visual stdio code 打开你的终端 Ctrl Alt T 并且运行下面的命令 sudo snap install cl
  • 围棋布局启蒙(系统学围棋,打实理论基础)

    1 占空角 2 守角的方法 3 挂角的方法 4 小目角的2个定式 5 星位角的2个定式 6 拆边的类型 7 拆边的原则 8 急所 9 布局总结 围棋布局启蒙 系统学围棋 打实理论基础 哔哩哔哩bilibili 教学
  • 【QT】04 对象树(对象模型)

    04 对象树 4 1 对象树概念 4 2 对象树构造及析构过程 释放对象 4 3 1 前提准备 4 3 2 对象树的构建及析构过程 4 3 QT中的坐标系 4 1 对象树概念 在qt中创建对象的时候会提供一个Parent对象指针 下面来解释
  • selenium上传文件解决方案

    说明 1 方式一使用selenium支持的的定位方式xpath解决上传文件问题 2 方式二和方式三使用图片定位方式解决上传文件问题 点击上传文件后 弹出的Windows对话框中 在文件名中输入图片路径 然后点击打开按钮 方式一 path 要
  • iOS开发系列—Objective-C之基础概览

    概览 前面我们已经用了几章内容进行C语言介绍 当然要通过几篇文章完整的介绍C语言的知识是不太现实的 例如C语言的文件操作 内存申请等我们都没有重点介绍 当然核心知识点基本都已经提到了 后面有时间我们会继续扩充 今天我们正式开始学习Objec