1.用Objective-C实现第一个Hello GeekBand程序:
在Xcode新建工程(相信这个不难做,这里不多说),保存工程名为:Hello -YUZHIBOYI.m。程序如写:
[plain]view plaincopy
#import
int main(int argc, const char*argv[ ]) {
NSLog(@"Hello,GeekBand!!!");
return(0);
}//在Xcode控制台可以看到输出:Hello,GeekBand!!!
现在来详细分析一下这个程序的结构:
(1)首先可以看到第一行#import,意思是使用头文件来包含元素声明,#import是GCC编译器提供的,其实也可以使用像C一样#include,不过很少这样用,因为如果用#include有可能出现重复包含头文件的情况,而#import可保证头文件只被包含一次,而不论次命令实际上在文件中出现多少次。
(2)Foundation是一个框架,它是Cocoa的组成框架之一,这个框架主要是处理用户界面之下的层中的特性,比如数据结构和通信机制。Foundation是一个主头文件。
(3)NSLog(@"Hello,GeekBand!!!");跟C里面的printf用法类似,首先来看看NS的含义,这个前缀告诉你的函数来自Cocoa而不是其他工具包,然后是@这个符号的作用,这个符号是Objective-C在标准C基础上添加的特性之一,在字符串前加一个@ 符号,表示引用的字符串应该作为Cocoa的NSString元素来处理。
其他部分和C的语言基本一样,不多作解释~
2.布尔类型:
Objective-C的布尔类型BOOL,它具有YES和BNO值,在编写程序的时候可以C里的布尔类型与Objective-C的布尔类型共存,但值得注意的是编写Cocoa代码时要使用BOOL。
(1)BOOL实际上是一种对带符号类型的定义,它使用8位存储空间,YES定义为1,NO定义为0.
(2)应该注意一个字节长度问题是:当将一个长于1字节的整形值(如int值)赋给一个BOOL变量,这时只有低位字节会用作BOOL值。
(3)例子,一个比较两个整形数是否不同,不同返回YES,否则NO。
[plain]view plaincopy
#import
BOOLareDifferent(int a,int b){
if(a == b){
return(NO);
}else{
return(YES);
}
}//判断是否不同
NSString*boolString(BOOL yesNo){
if(yesNo == NO){
return(@"NO");
}else{
return(@"YES");
}
}//返回YSE或NO
int main(int argc,const char *agv[ ]){
BOOLareABDifferent;
areABDifferent = areDifferent(3,3);
NSLog(@"are %d and %d different? %@", 3,3,boolString(areABDifferent));
areABDifferent = areDifferent(8,9);
NSLog(@"are %d and %d different? %@", 8,9,boolString(areABDifferent));
return(0);
}//运行结果为:are 3 and 3 different? NO
are8 and 9 different? YES
这里唯一值得注意的是:NSlog()的字符串结尾,可以看到另一个@符号,这里表现为%@,它的意思是,表示boolString()返回一个NSString指针,printf()不能使用NSString,所以没我们能够使用的格式说明符NSlog()的编写者添加%@格式说明符。
2.基础语法
Objective c是面向对象的
1、#import(引入头文件)语法
eg:#import
#import"SelfClass.h"
@classSelfClass
备注:<>只在系统文件中查找,””先在本地查找,没找到则到系统文件中查找,import可自动防止同一个文件被导入多次。实例变量类型一般用@class引入,这个可以缩短编译时间,一般用在interface中,里面的方法和变量不可用。
2、字符串NSString
@"字符串"
3、BOOL布尔类型
有YES和NO两个值,备注:大于0的数不一定是YES。
4、控制台输出NSLog()
%@输出NSString等对象的值
3.类的定义和实现
1、@interface用于定义接口类
接口一般在.h文件(头文件)中定义,用来展示类的构造。
Eg:定义基于NSObject类的Circle类
@interfaceCircle :NSObject
{
ShapeColor *fillColor;
}
-(void) draw;
-(void)setFillColor: (ShapeColor *) fillColor secondName:(int) index;
@end
1)、大括号内的变量为类的实例变量(只在对象的实例中有效,所以称为实例变量ivar),后面的为方法声明。备注:c函数原型中没有先行短线。
2)、方法返回类型与C函数有相同的类型:标准类型(整型、浮点型、字符串)、指针、引用对象和结构体,如果方法使用参数则需要冒号,否则不需要冒号。没有声明实例变量时,无需大括号。
3)、上面多参数方法定义,也可以不需要secondName,但不推荐这样使用。
4)、有些方法的声明是先行加号,这样的方法为类方法(class method),这个方法属于类对象(而不是类的实例对象),类似于静态方法,通常用于创建新的实例,我们称这种用来创建新对象的类方法为工厂方法。
5)、在对象类型的右边都有一个*号,所有的对象变量都是指针类型。id类型(任意类型)已经被预定义为指针类型,所以不需要再加一个*号。
2、@implementation
实现类一般在.m文件(实现文件)中实现,实现了接口所声明的所有方法。
Eg:上面Circle的实现类
@import “XXX.h”//引入上面定义的头文件
@implementationCircle
- (void)setFillColor: (ShapeColor *) c
{
fillColor = c;
}
3、对象的实例化
1)、Circle *circle = [Circle new];//不建议这样使用
2)、Circle *circle = [[Circle alloc]init];//一般这样初始化
4、方法的调用
[ciclesetFillColor: kRedColor];//备注中间是空格
5、实例变量作用域的指令:
@protected实例变量可被该类及任何子类中定义的方法直接访问(默认的情况)。
@private实例变量可被定义在该类的方法直接访问,不能被子类定义的方法直接访问。
@public实例变量可被该类中定义的方法直接访问,也可被其他类或模块中定义的方法访问。使得其他方法或函数可以通过(->)来访问实例变量(不推荐用)。
@package 对于64位图像,可以在实现该类的图像的任何地方访问这个实例变量。
6、继承
@interface Circle: NSObject
不支持多继承,但Objective-C通过其它特性达到多继承的效果,例如类别和协议。
7、复合(composition)
复合就好像音乐中的作曲一样:将多个组件组合在一起,配合使用,从而得到完整的作品。严格来说,只有对象间的组合才能叫复合。
复合类之间的关系为“has a”。备注:在Objective-C中,复合是通过包含作为实例变量的对象指针实现的。
Eg:汽车有4个轮胎和一台发动机。
@interface Car:NSObject
{
Engine *engine;
Tire *tire[4];
}
备注:为新建的Car对象分配内存时,这些指针将被初始化为nil(零值)