object-c 入门基础篇

87214552 2011-07-06

一、Objective-C与C的渊源

Objective-C诞生于20世纪80年代,由BradCox发明,意在将流行的、可移植的C语言与优雅的Smalltalk语言结合在一起。Objective-C是C语言的一个扩展集,它以C语言为基础,在语言中添加了一些微妙但意义重大的特性。

苹果公司的iphone平台采用Objective-C做为nativelanguage的开发,Objective-C的内核是C语言的,并基于C语言实现OOP的一些特性。Objective-C是对C语言的扩展,这和C++的前身Better-c有很大的相似之处,Objective-C的新版本里实现了和Java类似的垃圾回收机制,但基于iphone平台的资源限制,iphone平台并不支持垃圾回收机制。

二、初识Objective-C

1、Cocoa的组成

苹果公司将Cocoa、Carbon、QuickTime和OpenGL等技术作为框架集提供Cocoa组成部分有:(1)Foundation框架(有很多有用的,面向数据的低级类和数据结构);(2)ApplicationKit(也称AppKit)框架(包含了所有的用户接口对象和高级类,例如NS……),还有一个支持框架的套件,包括CoreAnimation和CoreImage。

2、NSLog相当于printf()

NSLog(@"helloObjective-C");

//注:@是Objective-C在标准C语言基础上添加的特征之一,双引号的字符串前面有一个@,这表示引用的字符串应该作为Cocoa的NSString元素处理

NSLog(@"are%dand%ddifferent?%@",5,5,boolString(areTheyDifferent));

//注意%@:使用NSLog输出任何对象值时,都会使用这个格式说明

3、BOOL使用8位存储,YES定义为1,NO定义为0,大于1不为YES,跟标准C不同。

若不小心将一个长于1字节的整型值赋给BOOL,则只截取低八位

Obejective-C中1不等于1,绝对不要将BOOL值和YES比较

三、怪异的Objective-C语法结构

我这里之所以说它的怪异,是相对于习惯其它编程语言(JAVA,C++等语言),下面把它最常见的特色简单说明:

1、减号(或者加号)

我们每天都会在IOS开发中见到在方法名前“+”或“─”号,那么这些是什么,怎么这么奇怪?

首先要把以前学习面向对象语言的惯性思维抛去,在Objective-C里面没有public和private的概念,你可以认为全是public;它只有类方法和实例方法,加号表示类方法,类方法可以直接调用,而不用创建这个类的实例;减号表示实例方法,需要创建这个类的实例对象才可以调用。

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

privatevoidhello(boolishello)

{

//OOXX

}

用Objective-C写出来就是

-(void)hello:(BOOL)ishello

{

//OOXX

}

有过编程经验的人,理解这些应该不难!

2、中括号

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

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

this.hello(true);

在Objective-C里,就要写成:

[selfhello:YES];

3、NS****

在IOS开发中,经常会遇到NS开头的对象,这个要从乔帮主历史恩怨说起。当年SteveJobs和JohnScullery与恩怨,乔帮主当年被人挤兑出苹果,自立门户的时候做了个公司叫做NextStep,里面这一整套开发包很是让一些科学家们喜欢,而现在MacOS用的就是NextStep这一套函数库。

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

NSLog

NSString

NSInteger

NSURL

NSImage

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

NSLog(@"%d",myInt);

这句话主要是在console里面跟踪使用,你会在console里面看到myInt的值(在XCode里面运行的时候打开dbg窗口即可看到)。

你还可以看到其他名字打头的一些类,比如CF、CA、CG、UI等等,比如

CFStringTokenizer这是个分词的东东

CALayer这表示CoreAnimation的层

CGPoint这表示一个点

UIImage这表示iPhone里面的图片

CF说的是CoreFoundation,CA说的是CoreAnimation,CG说的是CoreGraphics,UI说的是iPhone的UserInterface……还有很多别的,等你自己去发掘了。

四、Objective-C常见语法说明

1头文件引用使用#import“文件名”或者#import<文件名>的形式以确保每个头文件仅被包含一次;

2类声明以@interface类名:继承类开头,以@end结尾,类实现以@implementation类名开头,以@end结尾;

3实例方法,即成员方法,在方法名前面添加一个减号(-);类方法,在方法名前面添加一个加号(+);

4类方法的调用格式为[类名类方法],成员方法调用格式为[实例名实例方法],这种模式在ObjC中被称为消息机制,[对象消息]即给对象发送了一个消息,产生的效果就是该对象调用了该类中定义的对应的实例方法;

5下面以一个简单的例子来说明上述语法:

Print类.h文件(声明文件)

#import<Foundation/Foundation.h>

@interfacePrint:NSObject{//Objective-c的所有类都继承于NSObject

//成员属性

NSString*caption;

NSString*photographer;

}

//在Objective-C2.0引入了属性合成,相当于之前的get/set方法

@property(nonatomic,copy)NSString*caption;

@property(nonatomic,copy)NSString*photographer;

//类方法

+(NSString*)printName;

@end

Print类.m文件(实现文件)

#import"Print.h"

@implementationPrint

@synthesizephotographer;

@synthesizecaption;

//类方法

+(NSString*)printName

{

return(@"PrintResult");

}

@end

Print类使用

#import"Print.h"

intmain(intargc,constchar*argv[])

{

NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];

returnNSApplicationMain(argc,(constchar**)argv);

//类方法调用

NSLog(@"ClassName=/"%@/"",[PrintprintName]);

//初始化

Print*p=[[Printalloc]init];

//设置器调用

[psetCaption:@"MyCaption"];

[psetPhotographer:@"MyPhotographer"];

//获取器调用

NSLog(@"Caption=/"%@/"",[pcaption]);

NSLog(@"Photographer=/"%@/"",[pphotographer]);

[pooldrain];

return0;

}

运行这段代码,结果如下:

2011-05-3111:12:13.715demo[1471:903]Classname="PrintResult"

2011-05-3111:12:13.718demo[1471:903]Caption="MyCaption"

2011-05-3111:12:13.718demo[1471:903]Photographer="MyPhotographer"

相关推荐