Objective-C语法快速参考(C# 和 Objective-C 语法的比较)
大部分有一点其他平台开发基础的初学者看到XCode ,第一感想是磨拳擦掌,看到 Interface Builder 之后,
第一感想是跃跃欲试,而看到Objective-C 的语法,第一感想就变成就望而却步了。好吧,我是在说我自己。
如果你和我一样,对苹果相关的开发:Mac OS X 或是iPhone 有兴趣,但是第一时间看到 Objective-C 就
会头疼并伴有发烧症状的话,疗效比较好的快速治疗方法是阅读本文。大概花二十分钟左右,而且绝不无
聊的时间,你就会对 Objective-C 有那么一点点了解,至少读读例子不会那么头疼了。
不过假定你要有那么一点点 c++ 、c# 或是Java 的基础,至少能看到 c++ 、c# 或是java 的源码,能够大致明
白说得是什么。
这篇文章不是一篇科技文章,希望你也不要把它当做科技文章来读。文章非常不严谨,但是我相信你能看
得懂。
一、XCode、Objective-C、Cocoa说的是几样东西?
答案:三样东西。
XCode :你可以把它看成是一个开发环境,就好像Visual Studio 或者Netbeans 或者SharpDevelop 一样的玩
意。你可以将 Interface Builder 认为是 Visual Studio 中用来画界面的那部分功能单独提出来的程序。
Objective-C :这是一种语言,就好像 c++ 是一种语言,Java 是一种语言,c# 是一种语言,莺歌历史也是一
种语言一样。
Cocoa:是一大堆函数库,就好像 MFC、.NET、Swing 这类玩意,人家已经写好了一堆现成的东西,你只
要知道怎么用就可以了。
有些人会比较容易混淆 Objective-C 和Cocoa,就好像有些人会混淆 c# 和.NET 一样。这两个东西真的是两
个不一样的东西。
二、Objective-C是什么?
你可以把它认为是语法稍稍有点不一样的 c 语言。虽然第一眼望上去你可能会认为它是火星语,和你所认
知的任何一种语言都不一样。
先简单列出一点差别:
问题一:我在程序中看到大量的减号、中括号和 NS****这种东西,他们是什么玩意儿?
1 减号(或者加号)
减号表示一个函数、或者方法、或者消息的开始,怎么说都行。
比如c# 中,一个方法的写法可能是:
private void hello(bool ishello)
{
//OOXX
}
用Objective-C写出来就是
-( void ) hello:( BOOL )ishello
{
//OOXX
}
挺好懂的吧?
不过在Objective-C里面没有 public 和private 的概念,你可以认为全是 public。
而用加号的意思就是其他函数可以直接调用这个类中的这个函数,而不用创建这个类的实例。
2 中括号
中括号可以认为是如何调用你刚才写的这个方法,通常在Objective-C里说“ 消息”。
比如C#里你可以这么写:
this.hello(true );
在Objective-C里,就要写成:
[self hello: YES ];
3 NS****
老乔当年被人挤兑出苹果,自立门户的时候做了个公司叫做NextStep ,里面这一整套开发包很是让一些科
学家们喜欢,而现在 Mac OS 用的就是 NextStep 这一套函数库。
这些开发 NextStep 的人们比较自恋地把函数库里面所有的类都用 NextStep 的缩写打头命名,也就是 NS*
***了。比较常见的比如:
NSLog
NSString
NSInteger
NSURL
NSImage
…
你会经常看到一些教学里面会用到:
NSLog ( @"%d",myInt);
这句话主要是在 console 里面跟踪使用,你会在 console 里面看到myInt的值(在 XCode里面运行的时候
打开dbg 窗口即可看到)。而我们在其他开发环境里面可能会比较习惯使用MessageBox 这种方式进行调
试。
你还可以看到其他名字打头的一些类,比如 CF、CA、CG、UI 等等,比如
CFStringTokenizer 这是个分词的东东
CALayer 这表示 Core Animation的层
CGPoint 这表示一个点
UIImage 这表示 iPhone 里面的图片
CF说的是Core Foundation,CA说的是Core Animation,CG 说的是 Core Graphics,UI说的是iPhon
e 的User 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 t
hirdKid: (NSString * ) myThirdOldestKidName;
实现这个函数的时候:
-( void ) setKids: (NSString *)myOldestKidName secondKid: ( NSString *) mySecondOldestKidName t
hirdKid: (NSString *) myThirdOldestKidName{
大儿子 = myOldestKidName;
二儿子 = mySecondOldestKidName;
三儿子 = myThirdOldestKidName;
}
调用的时候:
Kids *myKids = [[Kids alloc] init ];
[myKids setKids: @”张大力” secondKid: @”张二力” thirdKid: @”张小力”];
而如果你用 c#写这个方法,大致的写法可能是
public void setKids( string myOldestKidName, string mySecondOldestKidName, string myThirdOldest
KidName)
{
…
}
调用的时候大概的写法可能是:
Kids myKids = new Kids();
myKids.setKids (“张大力”, “张二力”, “ 张小力” );
明白了吧?其实不怎么难看懂。
基本上,如果你能了解下面这段代码的转换关系,你Objective-C的语法也就懂了八成了:
[[[MyClass alloc] init :[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 个东西组成的数组,这个数组包括一个浮点数,两个字符串和一个图片。
3、BOOL ,YES ,NO:
你可以认为 YES 表示C#或者Java里的true ,NO表示false。而实际上 YES 是1
,NO是0,BOOL本身就是个char。
4、IBOutlet 、IBAction 是啥玩意,总能看到。
这两个东西其实在语法中没有太大的作用。如果你希望在Interface Builder 中能看到这个控件对象,那么
在定义的时候前面加上 IBOutlet ,在IB 里就能看到这个对象的 outlet,如果你希望在 Interface Builder 里
控制某个对象执行某些动作,就在方法前面加上(IBAction )。
而这两个东西实际上和 void 是一样的。
5、nil。
Objective-C里的NULL(空)就这么写,表示空指针。
6、为什么是@”字符串”而不是”字符串”
前面加上@符号,编译器在编译的时候会在程序中给你留出位置,这样才能保证这个字符串不会丢失。反
正记住,如果你要想把某些字符串写死在程序里,就要用@”字符串”,如果忘了用@,程序应该会出错。
superzhou大侠指正:
6、为什么是@”字符串”而不是”字符串”
”字符串”是C的字符串,@”"是把C的字符串转成NSString的一个简写.
在需要NSString的地方才需要这个转化,例如NSLog里面.
在需要C string的地方,还是用”字符串”的.
另外,@”"这个转换是不支持中文的.例如NSLog(@”字符串”); 是一定输出不了中文的.
四、Objective-C 2.0
Objective-C 2.0是Leopard 新增加的一门语言,其实和原来的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、学习一门语言最好的方法是先用,和学外语一样,当你会说的时候自然会读。给自己设立一个简单的目
标,比如做一个简单的程序,然后一点点解决问题。这样学习起来比只看例子快得多。
这是一篇初学者写的文章,希望对同样是初学者的你有一点点帮助:)虽然只是很肤浅的一点点内容,但
是应该对你迈入 Objective-C的大门有一点帮助。看懂了这篇文章,回过头看Cocoachina的其他文章,你
就会觉得很顺眼了。记得天天来哦。
另外,这篇 Objective-C的参考资料也比较好,如果你有兴趣可以一读。
http://www.otierney.net/objective-c.html.zh-tw.big5
Objective-C语法快速参考(C# 和 Objective-C 语法的比较)的更多相关文章
- jenkins2 pipeline 语法快速参考
jenkins2 pipeline中常用的语法快速参考. 文章来自:http://www.ciandcd.com文中的代码来自可以从github下载: https://github.com/ciand ...
- Razor 语法快速参考
Razor 语法快速参考 本文引自:http://haacked.com/archive/2011/01/06/razor-syntax-quick-reference.aspx 语法名称 Raz ...
- Razor语法快速参考
语法/示例 Razor Web Forms对应写法或说明 代码块 @{ int x = 123; string y = "because.";} <% int x = 123 ...
- C#7语法快速参考-第一章 Hello World
选择IDE 要开始使用C#编程,您需要一个支持微软.NET框架的集成开发环境(IDE).最受欢迎的选择是微软自己的Visual Studio.初学可以使用Visual Studio Community ...
- 【翻译】C#和.NET核心快速参考
原文:[翻译]C#和.NET核心快速参考 PS:在网上看到的一篇C#总结,英文的,总结的还可以,都是基础知识,翻译给大家学习.文章结尾有英文原版.发布地址:http://www.cnblogs.com ...
- SED单行脚本快速参考(Unix 流编辑器)(转)
sed.sourceforge.net被封杀,特在此处贴上官方的sed 使用说明文档 SED单行脚本快速参考(Unix 流编辑器) 2005年12月29日 英文标题:USEFUL ONE-LINE S ...
- SED单行脚本快速参考(Unix 流编辑器)
------------------------------------------------------------------------- SED单行脚本快速参考(Unix 流编辑器) 200 ...
- awk单行脚本快速参考
AWK单行脚本快速参考 2008年4月28日编辑: Eric Pement eric [at] pement.org 版本 0.26翻译: 董一粟 yisudong [at] gmail.com 最新 ...
- SQL 语句快速参考
来自 W3CSchool 的 SQL 快速参考 SQL 语句 语法 AND / OR SELECT column_name(s)FROM table_nameWHERE conditionAND|OR ...
随机推荐
- bzoj2756
看到相邻格子都+1的操作一下就想到黑白染色了相邻格子都+1说明不管怎么弄,黑格子的总和和白格子总和的差总是定值这里首先要注意,最后不一定变成的是所有元素中的最大值,可能比它大比如 1 2 2 ...
- ☀【DOM对象 / jQuery对象】
jQuery对象和DOM对象 √http://www.ituring.com.cn/article/38868 <!DOCTYPE html> <html lang="zh ...
- ☀【移动】UC极速模式
UC浏览器的部分版本默认是“极速”模式,有何办法能控制UC自动改变其浏览模式? √http://www.zhihu.com/question/20582949 关于UC极速模式下访问网站错乱 √htt ...
- zabbix中文配置指南(转)-服务器监控
一.Zabbix简介 1.1 Zabbix简介 Zabbix是一个企业级的开源分布式监控解决方案,由一个国外的团队持续维护更新,软件可以自由下载使用,运作团队靠提供收费的技术支持赢利.官方网站:htt ...
- uboot环境变量(设置bootargs向linux内核传递正确的参数)
这是我uboot的环境变量设置,在该设置下可以运行initram内核(从内存下载到nandflash再运行),但是运行nfs根文件系统的时候一直出错,各种错误.查看了很多资料后猜想应该是uboot传递 ...
- 使用Apache 的lib进行List、Set、数组之间的转换(转)
使用Apache Jakarta Commons Collections: import org.apache.commons.collections.CollectionUtils; String[ ...
- HDU 1285
#include<stdio.h> #include<string.h> int degree[505],vis[505],map[501][501]; int main() ...
- json包的loads dumps区分
符合json格式的字符串 --(json.laods)--> json(字典形式或是列表形式) --(json.dumps)--> 符合json格式的字符串
- SQL Server 堆表与栈表的对比(大表)
环境准备 使用1个表,生成1000万行来进行性能对比(勉强也算比较大了),对比性能差别. 为了简化过程,不提供生成随机数据的过程.该表初始为非聚集索引(堆表),测试过程中会改为聚集索引(栈表). CR ...
- oracle 临时表学习
临时表概念 临时表就是用来暂时保存临时数据(亦或叫中间数据)的一个数据库对象,它和普通表有些类似,然而又有很大区别.它只能存储在临时表空间,而非用户的表空间.ORACLE临时表是会话或事务级别的,只对 ...