object-c 入门基础篇

2023-11-13

大部分有一点其他平台开发基础的初学者看到XCode,第一感想是磨拳擦掌,看到Interface Builder之后,第一感想是跃跃欲试,而看到Objective-C的语法,第一感想就变成就望而却步了。好吧,我是在说我自己。

 

如果你和我一样,对苹果相关的开发:Mac OS X或是iPhone有兴趣,但是第一时间看到Objective-C就会头疼并伴有发烧症状的话,疗效比较好的快速治疗方法是阅读本文。大概花二十分钟左右,而且绝不无聊的时间,你就会对Objective-C有那么一点点了解,至少读读例子不会那么头疼了。

 

不过假定你要有那么一点点c++c#或是java的基础,至少能看到c++c#或是java的源码,能够大致明白说得是什么。

 

这篇文章不是一篇科技文章,希望你也不要把它当做科技文章来读。文章非常不严谨,但是我相信你能看得懂。

 

 

一、XCodeObjective-CCocoa说的是几样东西?

答案:三样东西。

 

XCode你可以把它看成是一个开发环境,就好像Visual Studio或者Netbeans或者SharpDevelop一样的玩意。你可以将Interface Builder认为是Visual Studio中用来画界面的那部分功能单独提出来的程序。

 

Objective-C这是一种语言,就好像c++是一种语言,Java是一种语言,c#是一种语言,莺歌历史也是一种语言一样。

 

Cocoa是一大堆函数库,就好像MFC.NETSwing这类玩意,人家已经写好了一堆现成的东西,你只要知道怎么用就可以了。

 

有些人会比较容易混淆Objective-CCocoa,就好像有些人会混淆c#.NET一样。这两个东西真的是两个不一样的东西。

二、Objective-C是什么?

你可以把它认为是语法稍稍有点不一样的c语言。虽然第一眼望上去你可能会认为它是火星语,和你所认知的任何一种语言都不一样。

 

先简单列出一点差别:

 

问题一:我在程序中看到大量的减号、中括号和NS****这种东西,他们是什么玩意儿?

 

减号(或者加号)

 

减号表示一个函数、或者方法、或者消息的开始,怎么说都行。

 

比如c#中,一个方法的写法可能是:

private voidhello(bool ishello)

{

//OOXX

}

 

Objective-C写出来就是

-(void) hello:(BOOL)ishello

{

//OOXX

}

挺好懂的吧?

 

不过在Objective-C里面没有publicprivate的概念,你可以认为全是public

 

而用加号的意思就是其他函数可以直接调用这个类中的这个函数,而不用创建这个类的实例。

 

中括号

 

中括号可以认为是如何调用你刚才写的这个方法,通常在Objective-C里说消息

 

比如C#里你可以这么写:

 

this.hello(true);

 

Objective-C里,就要写成:

 

[self hello:YES];

 

3 NS****

 

老乔当年被人挤兑出苹果,自立门户的时候做了个公司叫做NextStep,里面这一整套开发包很是让一些科学家们喜欢,而现在Mac OS用的就是NextStep这一套函数库。

 

这些开发NextStep的人们比较自恋地把函数库里面所有的类都用NextStep的缩写打头命名,也就是NS****了。比较常见的比如:

NS Log NS String NS Integer NS URL NS Image 你会经常看到一些教学里面会用到: NSLog ( @%d ,myInt); 这句话主要是在console里面跟踪使用,你会在console里面看到myInt的值

 

NSLog

NSString

NSInteger

NSURL

NSImage

 

你会经常看到一些教学里面会用到:

NSLog (@"%d",myInt);

 

这句话主要是在console里面跟踪使用,你会在console里面看到myInt的值(在XCode里面运行的时候打开dbg窗口即可看到)。而我们在其他开发环境里面可能会比较习惯使用MessageBox这种方式进行调试。

 

你还可以看到其他名字打头的一些类,比如CFCACGUI等等,比如

CFStringTokenizer 这是个分词的东东

CALayer 这表示Core Animation的层

CGPoint 这表示一个点

UIImage 这表示iPhone里面的图片

 

CF说的是Core FoundationCA说的是Core AnimationCG说的是Core GraphicsUI说的是iPhoneUser Interface……还有很多别的,等你自己去发掘了。

 

问题二、#import@interface这类玩意说的是什么?

 

1#import

 

你可以把它认为是#include,一样的。但是最好用#import,记住这个就行了。

 

2@interface等等

 

比如你在c#中写一个抓孩子类的定义:

 

public class Kids :System

{

private string kidName=mykid;

private string kidAge=15;

private bool isCaughtKid()

{

return true;

}

}

 

当然,上面的写法不一定对,就是个用于看语法的举例。

 

Objective-C里就得这么写:

 

先写一个kids.h文件定义这个类:

 

 

@interface Kids: NSObject {

NSString *kidName;

NSString *kidAge;

}

-(BOOL) isCaughtKid:;

@end

 

再写一个kids.m文件实现:

 

#import kids.h

@implementation Kids

-(void) init {

kidName=@mykid;

kidAge=@15;

}

 

-(BOOL) isCaughtKid:{

return YES;

}

@end

 

这个写法也不一定对,主要是看看语法就行了。-_-b

 

问题三、一个方法如何传递多个参数?

 

一个方法可以包含多个参数,不过后面的参数都要写名字。

 

多个参数的写法

 

(方法的数据类型函数名: (参数1数据类型参数1的数值的名字 参数2的名字: (参数2数据类型参数2值的名字 …. ;

举个例子,一个方法的定义:

-(void) setKids: (NSString *)myOldestKidName secondKid: (NSString *) mySecondOldestKidName thirdKid: (NSString *) myThirdOldestKidName;

 

实现这个函数的时候:

 

-(void) setKids: (NSString *)myOldestKidName secondKid: (NSString *) mySecondOldestKidName thirdKid: (NSString *) myThirdOldestKidName{

大儿子 = myOldestKidName;

二儿子 = mySecondOldestKidName;

三儿子 = myThirdOldestKidName;

}

 

调用的时候:

 

Kids *myKids = [[Kids allocinit];

[myKids setKids: @张大力 secondKid: @张二力 thirdKid: @张小力];

 

而如果你用c#写这个方法,大致的写法可能是

 

public void setKids( string myOldestKidName, string mySecondOldestKidName, string myThirdOldestKidName)

{

}

 

调用的时候大概的写法可能是:

 

Kids myKids = new Kids();

myKids.setKids (张大力张二力张小力);

 

明白了吧?其实不怎么难看懂。

 

基本上,如果你能了解下面这段代码的转换关系,你Objective-C的语法也就懂了八成了:

 

[[[MyClass allocinit:[foo bar]] autorelease];
 

转换成C#或者Java的语法也就是:

 

MyClass.alloc().init(foo.bar()).autorelease();

三、其他的一些东西

 

其实这些本站之前的文章有所提及,这里再详细解释一下。

 

1 id

 

Objective-C有一种比较特殊的数据类型是id。你可以把它理解为随便

 

Objective-C里,一切东西都是指针形式保存,你获取到的就是这个对象在内存的位置。那么id就是你知道这个位置,但是不知道里面是啥的时候的写法。

 

2 同一个数组可以保存不同的对象:

 

比如一个数组NSArray,这种数组里面可以保存各种不同的对象,比如这个数组里:

 

myArray <-|

 

                       0: (float)234.33f

                       1:@我是个好人

                       2: (NSImage * (俺的美图)

                       3:@我真的是好人

 

这是一个由4个东西组成的数组,这个数组包括一个浮点数,两个字符串和一个图片。

 

3BOOLYESNO

你可以认为YES表示C#或者Java里的trueNO表示false。而实际上YES1

 NO  0  BOOL 本身就是个 char  4IBOutletIBAction是啥玩意,总能看到。 这两个东西其实在语法中没有太大的作用。如果你希望在Interface Builder中能看

NO0BOOL本身就是个char

 

4IBOutletIBAction是啥玩意,总能看到。

这两个东西其实在语法中没有太大的作用。如果你希望在Interface Builder中能看到这个控件对象,那么在定义的时候前面加上IBOutlet,在IB里就能看到这个对象的outlet,如果你希望在Interface Builder里控制某个对象执行某些动作,就在方法前面加上(IBAction)

 

而这两个东西实际上和void是一样的。

 

5nil

Objective-C里的NULL(空)就这么写,表示空指针。

 

6、为什么是@字符串而不是字符串

 

前面加上@符号,编译器在编译的时候会在程序中给你留出位置,这样才能保证这个字符串不会丢失。反正记住,如果你要想把某些字符串写死在程序里,就要用@字符串,如果忘了用@,程序应该会出错。

 

superzhou大侠指正:

6、为什么是@”字符串而不是字符串

字符串C的字符串,@”"是把C的字符串转成NSString的一个简写.
在需要NSString的地方才需要这个转化,例如NSLog里面.
在需要C string的地方,还是用字符串.

另外,@”"这个转换是不支持中文的.例如NSLog(@”字符串”); 是一定输出不了中文的.

 

四、Objective-C 2.0

Objective-C 2.0Leopard新增加的一门语言,其实和原来的Objective-C是一样的。主要是增加了属性。详细的内容这里不写了,可以参阅Allen Dang的这篇文章,写的很明白。

 

http://blog.codingmylife.com/?p=81

 

五、总结

 

现在来总结一下怎么看Objective-C的代码和怎么开始学Objective-C吧。

 

1、记住Objective-C就是C,不是火星语,这个很关键。

2、记住你自己看不懂不表示脑子迟钝,大部分人第一次看Objective-C的代码可能比你还要迟钝。

3、把CocoaChina.com加入收藏夹,看不明白代码就来再看一遍这篇开宗明义的好文。

4、文档很关键,当你看不懂某些东西说的是什么的时候,先查Cocoachina,再看英文文档里面的API说明,尤其这个类是以NS开头的时候。再不行就去google搜,直接把你要查的方法贴进google,通常能找到不少人也在问同样的问题,自然也有热心人活雷锋帮助回答。

5、可以看hello world例子,但是不能总看,看多了真的会晕。另外,千万要放弃苹果官方的Currency Converter货币转换的例子,那个例子是毒药,刚学的时候越看越蒙。

6、学习一门语言最好的方法是先用,和学外语一样,当你会说的时候自然会读。给自己设立一个简单的目标,比如做一个简单的程序,然后一点点解决问题。这样学习起来比只看例子快得多。


http://www.360doc.com/content/10/1115/11/4613532_69493211.shtml


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

object-c 入门基础篇 的相关文章

  • 学习新技术的10个建议

    学习新技术的10个建议 http www apkbus com portal php mod view aid 1780 我们生活在一个振奋人心的时代 我们可以越来越方便廉价地获得大量学习资源 这些资源的传播载体由最初的教室被变成了博客 技
  • “范式杯”2023牛客暑期多校训练营1

    D Chocolate 题意 有n m的矩阵 分成n m块 每一块都有一块巧克力 然后A和B两个人 进行博弈 选择一个下标 i j 将左上角 1 1 到 i j 的巧克力全部吃掉 如果谁是最后一个吃完全部巧克力 那么就输了 每人至少吃一块巧
  • 支付宝API接口开发相关文档以及实例

    支付宝实物即时到账接口 在下载该接口之前 请确定你已经签约了即时到账的服务协议 并且账号已经开通了即时到账的权限 口常见错误问题搜集 http union alipay com alipay zhichi shiwu 商家工具FAQ pdf
  • Python兼职:800-1500元/天,多做多得,时间自由!

    以下三种情况 哪个让你最绝望 好不容易找到一个资源齐全的网站 不是要收费就是要翻墙 每次想看的音乐会 想抢的假期车票 永远抢不到 工资4500 生活费1000 花呗欠了10000 说实话 反正我真的选不出 每一个都让我崩溃 但是我将这个测试
  • kibana创建索引_Elasticsearch 实战案例(索引切分、模板、别名、数据迁移)

    背景 基于ELK搭建的日志平台 前期匆忙建设过程中一些参数和设计未做过多的考虑 上线后就需要不断根据实际情况做调整 而一些调整限于ELK的一些特性 一旦操作不当就会出现丢数据 数据写入异常 数据查不到等情况 因此如何在这种背景下 做到对使用
  • 海康威视智能终端获取实时人脸体温识别记录二次开发java

    需求 使用的是海康威视人脸带体温识别智能终端 根据主动获取设备事件现在不支持获取体温 所以实时获取 参考设备布防 设备登陆注册省略 见 海康威视人脸识别智能终端获取设备事件二次开发Java 设备布防 Thread sleep 100000
  • Flutter 应用开发的pubspec.yaml文件说明

    pubspec yaml文件简介 作用 pubspec yaml是Flutter项目中的配置文件 它用于定义项目的依赖项 资源文件以及其他相关配置 示例 name audioplayers example description Demon
  • 进程和线程的区别

    转自文章进程和线程的区别 面试必考 进程和线程的区别 1 根本区别 进程和线程的根本区别是进程是操作系统 OS 资源分配的基本单位 而线程是处理器 CPU 任务调度和执行的基本单位 2 资源开销 每个进程都有独立的代码和数据空间 程序上下文
  • 【Nginx系列】- Nginx源码复杂安装

    目录 一 下载nginx源码 二 依赖环境准备 三 编译安装 四 加入系统服务 Nginx安装方式有多种 本篇介绍源码复杂安装 目的是进一步了解Nginx 一 下载nginx源码 官网下载最新稳定版 nginx download 二 依赖环
  • 23种设计模式总结

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 23种设计模式总结 设计模式是一套被反复使用 多数人只晓得 经过分类编目的的 代码设计经验的总结 1 简单工厂模式 建立一个工厂类 对同一接口下的类进行实例化的创建 也就是在
  • Otter源码深入详解(二)

    先从manager的三个子模块开始分析 一 biz模块 autokeeper AutoKeeperCollector类 继承自InitializingBean afterPropertiesSet 调用后 调用startCollect st
  • 参考系列2:优化库——ceres(一)快速概览

    目录 1 ceres快速概览 1 1 问题建模和求解 1 1 1 问题建模 1 1 2 问题求解 1 2 ceres使用流程 1 3 求导方法 构建代价函数 STEP2 1 3 1 解析求导 自定义求导 SLAM中常用的 1 3 2 其他求
  • jmap heap输出解析

    jmap heap输出解析 jmap简介 jmap语法 jmap heap查看jvm参数 堆栈信息 jmap heap输出jvm参数解析 jmap简介 jmap JVM Memory Map 作用一方面是获取dump文件 堆转储快照文件 二
  • [分享] Python实现的基于深度学习的手写数字识别算法

    本文将采用深度学习中的卷积神经网络来训练手写数字识别模型 使用卷积神经网络建立合理的模型结构 利用卷积层中设定一定数目的卷积核 即滤波器 通过训练数据使模型学习到能够反映出十个不同手写提数字特征的卷积核权值 最后通过全连接层使用softma
  • Android studio安装与配置

    1 首先下载Android studio安装包 下载地址为 http www android studio org 这里采用3 0版本进行演示 对应安装包为android studio ide 171 4408382 windows exe
  • 【微服务】Nacos:发现、配置和管理微服务

    Nacos 发现 配置和管理微服务 Nacos 在阿里巴巴起源于 2008 2008 2008 年五彩石项目 完成微服务拆分和业务中台建设 成长于十年双十一的洪峰考验 沉淀了简单易用 稳定可靠 性能卓越的核心竞争力 随着云计算兴起 2018
  • odoo 附件上传的三种姿势

    odoo 附件上传的三种姿势 因公司业务需要实现上传附件功能 一番折腾找到了三种附件上传的姿势 不过好像用处不大 1 下载 odoo 自带模块 在应用里搜索附件列出以及文档索引 安装模块即可 这样在编辑界面就可以看见附件上传按钮 上传即可

随机推荐

  • 使用微软官方工具MediaCreationTool制作Windows10的U盘系统安装盘

    需要重装系Windows10系统 这里介绍使用微软官方工具MediaCreationTool制作Windows10的U盘安装盘的步骤 1 点击链接https www microsoft com zh cn software download
  • [每日两题系列]刷算法题咯~~

    今日题目 最多能完成排序的块II 统计子矩阵 本系列所选题目均来自力扣或者牛客网站 所选题目主要是以其中的简单题为主 中等题为辅 包含少数困难题 原因是 本人目前能力还不够 开展这个系列的目的是督促自己 在暑假的时间里也要保持有一定的刷题量
  • Docker修改默认数据目录Docker Root Dir

    环境 Docker版本 19 03 12 OS版本 CentOS Linux release 7 7 1908 Core docker 默认数据目录 Docker Root Dir 是 var lib docker 可通过 docker i
  • 数组参数:交换数组中最大值和最小值的位置

    题目 定义一个函数 功能 实现数组中最大值和最小值交换位置 解题思路 定义一个数组参数的函数 首先要先找到数组元素中的最大值和最小值 然后用我们常用的方法来将最大值和最小值进行转换 最后在main函数中调用所定义的f函数 include
  • 【Python游戏】Python各大游戏合集(3):飞翔的小鸟、俄罗斯方块、24点小游戏、吃豆豆小游、扫雷

    相关文件 关注小编 私信小编领取哟 当然别忘了一件三连哟 公众号 Python日志 可以关注小编公众号 会不定时的发布一下Python小技巧 还有很多资源可以免费领取哟 源码领取 加Python学习交流群 773162165 可以领取哟 开
  • 前端面试题---框架篇

    Vue面试题 面试题 Vue2 x 生命周期有哪些 Vue生命周期总共可以分为8个阶段 创建前后 载入前后 更新前后 销毁前销毁后 以及一些特殊场景的生命周期 面试题 第一次进入组件或者页面 会执行哪些生命周期 beforeCreate c
  • 7.20黄金涨势是否会延续?今日如何布局

    近期有哪些消息面影响黄金走势 今日黄金多空该如何研判 黄金消息面解析 国际金价周四 7月20日 徘徊在1984美元 盎司附近 投资者继续押注近期公布的美国经济数据让美联储有理由暂停加息 金价上个交易日触及的5月24日以来新高1985 25美
  • python爬取支付宝基金数据_钱袋子往哪走?教你用Python爬取基金数据

    年关将至 钱袋子往哪走 有人买了定期存款 3年 年利率 3 987 按存50w计算 0 0385 50万 3年息 6万 月息 1666 72元0 039785 50万 3年息 6 21万 月息 1724 53元0 04125 50万 3年息
  • 跳跃游戏(两种详细解答)

    第一种 从前开始 class Solution public boolean canJump int nums 定义reach为能够到达的最远距离 int reach 0 for int i 0 i lt reach i temp表示在下标
  • java调用微信支付接口

    https github com binarywang weixin java pay demo pox xml引入依赖
  • 为何AI无法完全理解人类情感?GPT-4能否理解人类的情绪?

    在科幻小说和电影里 我们经常看到超级AI人工智能机器人可以理解 感知甚至模拟人类的情感 但在现实世界中 我们距离这个目标还有一段相当长的距离 即使是强大的GPT 4甚至未来的GPT 5 过高夸大AI的体验和性能 往往并不利于科技的发展 元宇
  • 华为OD流程走完了

    我机试题地址 传送门 huaweiOD机试题 机试过了后 华为上海部HR一面 耗时30分钟左右 问了些家庭 个人工作经历 包括结婚否 为什么辞职之类的 技术二面 同样 自我介绍结束后 问了些项目相关的细节 该环节完后 面试官共享其试题 限时
  • 猿创征文 |万字长文搞定企业中的mysql数据库部署及使用

    文章目录 Mysql 二进制安装及mycat 读写分离 1 学习环境 2 初始化环境 2 1 关闭selinux 防火墙 2 2 修改主机名 2 3 配置域名解析 2 4 时间同步 3 mysql 安装 3 1 二进制包上传服务器 3 2
  • winCE中实现虚拟串口的方法

    转载请标明是引用于 http blog csdn net chenyujing1234 欢迎大家拍砖 环境 wince6 0 ARM Freescell 一 目的 设计一个读GPS串口数据的驱动 并注册为COM口 二 实现过程 1 COM
  • CSS文字居中对齐学习

    CSS使用text align属性设置文字对齐方式 text align center 这样就设置了文字居中对齐
  • MDK编译生成的HEX、map与htm文件分析

    MDK编译生成的HEX map与htm文件分析 hex文件 Intel HEX文件是记录文本行的ASCII文本文件 在Intel HEX文件中 每一行是一个HEX记录 由十六进制数组成的机器码或者数据常量 Intel HEX文件经常被用于将
  • TCP报文段

    文章目录 什么是TCP TCP报文段 源端口号 目标端口号 序列号 Sequence number 确认号ack 数据偏移 首部长度 保留 8个标志 核心 窗口大小 校验和 可选项 填充 什么是TCP TCP是面向连接的 可靠的 基于字节流
  • Linux常用语法

    文章目录 第一章 Linux概述 第二章 Linux常用命令 第一讲 进入某个路径 第二讲 查看日志 VI 查看静态日志 tail watch 实时日志 tail 搭配使用参数 查看日志目标行 导出日志 查看当前路径下文件 按文件名查找文件
  • STM32定时器输入捕获

    STM32定时器输入捕获 用STM32F429做定时器捕获PWM波形 测出波形的周期 频率以及占空比 正向脉宽 基本原理 定时器的输入捕获主要是为了测量输入信号的频率 脉宽 占空比等信息 需要理解stm32定时器的基本结构 主要理解这些框起
  • object-c 入门基础篇

    大部分有一点其他平台开发基础的初学者看到XCode 第一感想是磨拳擦掌 看到Interface Builder之后 第一感想是跃跃欲试 而看到Objective C的语法 第一感想就变成就望而却步了 好吧 我是在说我自己 如果你和我一样 对