`
mmdev
  • 浏览: 12893513 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

Object-C语法轻松剖析

 
阅读更多
我们在苹果开发中,总会看到XCode,Interface Builder,Object-c这如此入耳入随的单词,但往往多数人在认为XCODE看着简单,InterfaceBuilder好似操作,
而Object-c却望而生畏,如果作为我们只想需要初学才见的话,理解了它的语法,或者你已经懂了相关如,JAVA,或者C#,或者C,C++等语言的开发后,你会觉得任何一门语言,
熟悉它的语法那是必须的,了解了它,你也就掌握了此语言60%的,好了,OK,希望这篇文章并不会让你感到看而疲惫
一、我们怎么去理解Xcode、OBJECT-C、COCOA
这是一个很简单的问题,但是也是一个很让人能够真正去理解的问题,多数人不能够真正清楚的去认识自己对某事物的理解程度,所以在这里我需要强调的是,如果你
真的对某事物开始研究时,你就需要真正的去理解它与认识它,在这里,我们可以简单的认为XCode其实就是一个集成开发环境,相对于我们比较常用的NetBeans,或者是VisualStudio,然而Interface Builder呢,你则可以认为它就是对其界面的展示,
然而Object就是一们开发语言,就像C,C++,JAVA等一种可以独立作开发的单独语言,最后就是Cocoa则是一大堆函数库,如果你使用C#,你可以认为它就是一个MFC等.
二、什么是OBJECT-C?
在这里我们要重点掌握关于OBJECT-C,它并不时火星语言,准确的说,我们可以去很好的认识它,在这里我就以其简单的列子来描述,如我们在开发中常看到关于有大量的减号、中括号、NS*等,
首先来说说减号或者加号,减号可以表示一个函数、方法、消息的开始,如在C#中,对于一个方法的写法可能是:
public void helloWorld(int a){
//xxx
}
然而使用OBJECT-C则是:
-(void)helloWorld(INT)a{
//xxx
}
在这里我们需要说明的是,在Object-c里面没有Private或者Public之描述哦,但是有人则认为你可以把它统一看成是public的,然而在使用加号的时候则对于其它函数可以直接调用这个类中的这个函数,而不需要创建这个类的实例,需要注意的是加号相对来说是表示静态的意思.
其次我们来说说关于中括号的问题:
中括号通常可以认为是如何调用你写的方法,在OBJECT_C中可以认为是消息,如在JAVA中:this.demo(true),而在Object-C中就应该写成:[self demo:YES],OK....
再次,我们可以来谈谈关于这个非常常见的NS*了,在这里,你可以想象到当年乔布斯被苹果挤脱出后,自己创建了一个公司叫做:NextStep,在这里我们来关注下关于NextStep,这套库非常优异,赢得多数专研人员去研究,然而现在的MAC OS用的久是NextStep这套函数库.
NextStep:
NEXTSTEP,(官方写法很多种,一开始叫做NextStep、NeXTstep、 NeXTSTEP,最后才叫做NEXTSTEP。)是由NeXT.Inc所开发的操作系统。NeXT也是已故苹果电脑CEO,Steve Jobs在1985年离开苹果电脑后所创立的公司。

这套系统是以Mach和BSD为基础,以Objective-C作为原生语言,具有很先进的GUI接口。1.0版推出时间是在1989年9月18日。刚开始NEXTSTEP只能在NeXT电脑的Motorola 68000上执行,1992年推出PC版的NEXTSTEP 486。3.1版和3.2版分别在1993年的5月及10月推出,但是终究失败。最后版本3.3在1995年释出,平台也已经不限于Motorola 68000家族,亦可在IBM PC x86、Sun SPARC及HP PA-RISC等平台上运行。后来苹果电脑在1997年2月将NeXT买下,成为Mac OS X的基础。

特色

  • 先进的GUI
  • 类似MacOSX的Dock,正在运行的程式会分配到一个图示,事实上应该说成是MacOSX延续NeXTSTEP的接口。
  • 48x48的全彩icon,是当时最大最细致的位图标系统。
  • Miller Columns档案浏览接口,档案以树状结构显示。现在Mac OS XFinder就是采用此概念。
  • 采用面向对象程式设计。

[编辑]版本

版本 发布时间 备注 0.8 0.8a 0.9 1.0 1.0a 2.0 2.1 2.1a 2.2 3.0 3.1 3.2 3.3 4.0(测试版)
1988年10月12日
1988年
1988年 第一个正式发布版本,只支援NeXT硬件。
1989年
1989年
1990年9月18日
1991年3月25日
1993年5月25日 开始支援i486PA-RISCSPARC架构。
1993年10月
1995年2月 以NeXTSTEP名义发行的最后一版,也是最受欢迎的版本。
1996年 测试版限制只有开发者得以取得。

到3.3版后,NeXT公司即被苹果电脑买下。

[编辑]应用

  • 世界上第一台WWWServer是蒂姆·伯纳斯-李在一台NeXTCube上架出来的。第一个网络浏览器(就直接叫做WorldWideWeb)也是以NeXTSTEP为操作系统所开发的。
  • 优异的多媒体支援,但当时也只有少数的医院买的起NeXT电脑来存放X光等资料。

[编辑]其他

有一个X11视窗管理程式Window Maker就是在模仿NeXTSTEP接口。

在这里我们举例NS开头的:

NSLog

NSString

NSInteger

NSURL

NSImage

.....

如: NSLog(@"%d",myInt)

这在console控制里面可以看到myint的值,即在xcode运行时打开dbg窗口即可看到,当然我们更习惯使用MMessageBox的方式进行调试.

为以上,你还可以看到其它名字打头的一些类,如,CF、CA、CG、UI等等:

如:

CFStringTokenizer即为分词来用

CALayer这表示Core Animation的层

CGPoint即表示一个点

UIImage即表示iPhone里面的图片

对以上缩写进行分解下吧:

CF即指的是Core Foundation,CA指的是Core Animation,CG指的是Core Graphics,UI指的是Iphone的UUser Interface.......

在下来,我们看看#import、@interface,

当然,像#import你可以理解为#include,看在什么环境下使用了,在IPHONE开发里你就得这样理解了哦.

其次就是@interface如在网上看到一个列子用抓孩子的列子,使用C#来举的例子,如:

public class Kids:System

{

private string kidName = "name";

private string kidAge = "12";

private bool isCaughtKid()

{

return true;

}

}

然而在这里就指出了在OBJECT_C中的写法:

@interface Kids : NSObject{

NSString *kidName;

NSString *kidAge;

}

-(BOOL) isCaughtKid

@end

接下来再写一个kids.m文件实现

#import "kids.h"

@implementation Kids

-(void) init{

kidName=@"mykid";

kidAge=@"12";

}

-(BOOL) isCaughtKid

{

return YES;

}

@end

OK,以上就是简单的举例

下面我们来看下关于传递多个参数的问题:

一个方法可以包含多个参数,只是后面的参数都要写名字:

(方法的数据类型)函数名:(参数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 = [[Kidsalloc]init];

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

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

public voidsetKids(stringmyOldestKidName,stringmySecondOldestKidName,stringmyThirdOldestKidName)

{

}

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

Kids myKids =newKids();

myKids.setKids (“张大力”,“张二力”,“张小力”);

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

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

[[[MyClassalloc]init:[foo bar]]autorelease];

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

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

三、其他的一些东西

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

1、 id:

Objective-C有一种比较特殊的数据类型是id。你可以把它理解为“随便”。(等价 c 中的 void *)

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

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

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

myArray <—-|

0: (float)234.33f

1:@”我是个好人”

2: (NSImage *)(俺的美图)

3:@”我真的是好人”

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

3、BOOL,YES,NO:

你可以认为YES表示C#或者Java里的trueNO表示false。而实际上YES1NO0BOOL本身就是个char

4、IBOutlet、IBAction是啥玩意,总能看到。

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

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

5、nil。

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

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


OK 部分作为参考而已......

分享到:
评论

相关推荐

    精通Object-C:从基础到高级项目实践.docx

    本教程旨在为初学者和中级开发者提供一个全面的Object-C编程学习路径,从基础语法入手,逐步深入到高级编程技巧,并通过实际案例和项目练习,帮助学习者掌握Object-C在iOS和OS X开发中的应用。无论你是想开发iOS应用...

    Cool-Compiler:CS143的“Classroom Object-Oriented Language”编译器在斯坦福开放课件上的实现

    CS143的“Classroom Object-Oriented Language”编译器在斯坦福开放课件上的实现 这个目录中的文件可能会变得非常混乱,所以这里是一个基本的浏览: PA2J:词法分析器 该目录包含 JFlex 用于创建词法分析器的类和 ...

    cCompiler:c语言编译器,用lex和yacc工具完成词法分析与语法分析并生成语法树,C ++实现了语法树的解析并生成中间代码,生成中间代码的过程中实现了错误检测。之后利用python对中间代码进行处理并生成mips汇流编码并且可以成功在PCSpim(mips模拟器)上运行

    词法分析与语法分析的原始文件扩展: ://www.quut.com/c/ANSI-C-grammar-l-1998.html和 实现了C语言除了struct和指针几乎所有的语法。 运行 环境要求:flex bison g ++ 11 python3 中间代码生成 Windows命令行输入:...

    代码语法错误分析工具pclint8.0

    PC-Lint是C/C++软件代码静态分析工具,你可以把它看作是一种更加严格的编译器。它不仅可以检查出一般的语法错误,还可以检查出那些虽然符合语法要求但不易发现的潜在错误。 C语言的灵活性带来了代码效率的提升,但...

    用C#实现一个Json解析器(5)——语法分析器

    目录前言语法分析器接口基本语法分析器类泛型方法带Type参数的方法ParseObjectParseArrayParseBaseTypedynamic方法 前言 本次我们实现解析器的语法分析功能。 注意:示例代码使用了C#8.0的语法特性,如果要在你的...

    分析业务模型-类图(ClassDiagram)

    类图是锻炼面向对象分析(OOA:Object-Oriented Analysis)和面向对象设计(OOD:Object-OrientedDesign)思想的重要的工具,是业务结构建模的重要工具。本章将会有大量的实战练习,你的OOA思想将会接受极大的考验和...

    修练8年C++面向对象程序设计之体会

    六年前,我刚热恋“面向对象”(Object-Oriented)时,一口气记住了近十个定义。... 有些学者建议这样找“对象”:分析一个句子的语法,找出名词和动词,名词就是对象,动词则是对象的方法(即函数)。

    MyEclipse_9创建SSH2开发环境必须的独立包

    antlr-2.7.6.jar 语法分析生成器 backport-util-concurrent-3.1.jar ehcache支持jar cglib-nodep-2.1_3.jar 是一种高性能,高质量的代码产生库, Hibernate 用它来实现 po (persistent object)字节码的动态生成 ...

    js的Object.assign用法示例分析

    本文实例讲述了js的Object.assign用法。分享给大家供大家参考,具体如下: 作用 Object.assign() 用于将所有可枚举的自有属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。 语法 Object.assign(target...

    Delphi7.完美经典.part1

    深入剖析了Object Pascal程序语言,包括指针、数据结构以及有关Override 和Overload函数的语法等。 对面向对象的观点详述了Delphi VCL组件的属性、方法及事件,且在数据库设计方面辅以应用的范例。 ...

    C#与.NET技术平台实战演练.part2

    C#是微软为.NET技术量身订制的语言,它拥有简洁的语法和便于开发的特性。本书将C#的特色与应用,借助实战演练的方式,阶段性地引导读者建置完整的应用程序,是您掌握新技术的最佳捷径。【图书目录】-C#与.NET技术...

    ognl源代码+API

    OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,...

    flex-bison:flex&bison(词法分析和解析)

    弹性与野牛 Source Code --&gt; Abstract Syntax Tree --&gt; Control Flow Graph --&gt; Object Code 抽象语法树(AST) 使用词法分析器(如flex)识别令牌 使用解析器(例如野牛)来生成AST 控制流图(CFG)

    C#与.NET技术平台实战演练.part1

    C#是微软为.NET技术量身订制的语言,它拥有简洁的语法和便于开发的特性。本书将C#的特色与应用,借助实战演练的方式,阶段性地引导读者建置完整的应用程序,是您掌握新技术的最佳捷径。【图书目录】-C#与.NET技术...

    美国..现代编译原理C语言描述.高清版

    本书全面讲述了现代编译器的各个组成部分,包括词法分析、语法分析、抽象语法、语义检查、中间代码表示、指令选择、数据流分析、寄存器分配以及运行时系统等。全书分成两部分,第一部分是编译的基础知识,适用于第一...

    php中get_object_vars()方法用法实例

    语法:get_object_var($object),返回一个数组。获取$object对象中的属性,组成一个数组 实例: &lt;?php class person{ public $name=王美人; public $age = 25; public $birth; } $p = new person(); print_r...

    PHP使用mysql_fetch_object从查询结果中获取对象集的方法

    mysql_fetch_object语法: array mysql_fetch_object (resource $Result_Set) Result_Set句柄返回一个mysql_query查询结果集。 如果执行成功返回包含了所有数据行的object,如果失败则返回bool值 下面是演示代码...

    编译原理词法分析法语分析实验报告

    词法分析,LL1语法分析,语义分析,中间代码生成,中间代码优化(常表达式优化,公共表达式优化,循环不变式优化),中间代码生成目标代码,目标代码-lexical analysis, LL1 syntax analysis, semantic analysis and...

    jQuery使用$.extend(true,object1, object2);实现深拷贝对象的方法分析

    语法:jQuery.extend( [deep ], target, object1 [, objectN ] ) 深浅拷贝对应的参数就是[deep],是可选的,为true或false。默认情况是false(浅拷贝),并且false是不能够显示的写出来的。如果想写,只能写true(深...

Global site tag (gtag.js) - Google Analytics