Objective_ C语法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

方法声明包括方法类型标识符,返回值类型,一个或多个方法标识关键字,参数类型和名信息。

图2展示insertObject:atIndex:实例方法的声明。

声明由一个减号(-)开始,这表明这是一个实例方法。

方法实际的名字(insertObject:atIndex:)是所有方法标识关键的级联。

声明以—开始。

类方法的典型用途是用做创建新的类实例的工厂方法,或者是访问类相关的共享信息的途径。

类方法声明的语法跟实例方法的几乎完全一样,只有一点小差别。

与实例方法使用减号作为方法类型标识符不同,类方法使用加号( + )。

类方法使用(+)开头,实例方法使用(—)开头。

Super 关键字:调用该类的父类;
超类:父类的另一种说法。

id 数据类型可存储任何类型的对象。

从某种意义说,它是一般对象类型。

例如,程序行
id number;
将number声明为id类型的变量。

可声明方法使其具有id类型的返回值,如下:
-(id) newObject: (int) type;
这个程序行声明了一个名为newObject的实例方法,它具有名为type的单个整型参数并有id类型的返回值。

应该注意的是,对返回值和参数类型声明来说,id是默认的类型。

因此,以下程序行:
+allocInit;
声明了一个返回id类型的类方法。

id类型是Objective-C中的非常重要的数据类型,它是多态和动态绑定的基础,这在以后的苹果开发中会经常用到。

创建字符串:
NSString *test;
test=[NSString stringWithFormat:@"i'm %d years old!",23];
test=[NSString stringWithFormat:@”I am %d years old. 23”]
NSArray类:可以存放任意类型的对象.
它有两个限制:
1. 它只能存储objective-c的对象,但不能存储C中的基本数据类型,如int , float, enum, struct等。

2.不能存储nil(对象的零值或NULL值);【因为在创建NSArray时,要在列表结尾添加nil代表列表结束。


创建NSArray:
NSArray *array;
array=[NSArray arrayWithObjects:@"one",@"two",nil];
array=[NSArray arrayWithObjects:@”one”,@”two”nil];
NSString, NSMutableString类;
【NSString是不可变的,即一旦创建完成,就不能通过删除字符或添加字符的方式来改变它;
而NSMutableString是可变的。

对象初始化
两种创建新对象的方法:
[类名new]
[[类名alloc] init] [[类名,alloc]init]
这两种方法是等价的,但cocoa的惯例是使用后者。

alloc在为对象分配空间的同时,将这块内存初始化为0;
C中[]表示数组,但是在Objective中,[]不仅表示数组,而且带有数组中的操作。

[]中第一项是对象,其余部分是对对象的操作。

Rect
#import <Foundation/Foundation.h> snapshot
Objective_c的复合是通过包含作为实例变量的指针实现的。

Implemention Numerator
创建新对象的两种方法:1、[类名new] 2、[[类名alloc] init] 两种方法等价2、[[类名alloc] init]更加常用例如:Car *car =[[ Car alloc] init] Allocation 分配对象initialization 初始化
Allocation 分配对象initialization 初始化对象
#import <Cocoa/Cocoa.h>
@interface Tire :NSObject
{
float pressure ;
float treadDepth;
}
-(void) setPressure:(float) pressure;
-(void) pressure;
-(void) setTreadDepth:(float) treadDepth;
-(float) treadDepth;
@end //Tire
#import <Tire.h>
@implementation Tire //@implementation Tire
-(id)init
{ if(self=[super init])
{pressure=34.0;treadDepth=20.0;}
Return (self);
}
-(void) setPressure:(float) p
{ pressure =p;
}//setPressure
……
@end//Tire
[car setEngine : engine] 把engine 对象传递给car对象
[tire release] 把tire释放掉
-(id)init
{if(self=[super init])
{ 类对象的初始化
}
return(self);
2// self = [super init];
if(self){
// Initialize members
}
return self;
}
NSAureleasePool 自动释放池
1. NSAutoreleasePool实际上是个对象引用计数自动处理器。

NSAutoreleasePool可以同时有多个,它的组织是个栈,总是存在一个栈顶pool,也就是当前pool,每创建一个pool,就往栈里压一个,改变当前pool为新建的pool,然后,每次给pool发送drain消息,就弹出栈顶的pool,改当前pool为栈里的下一个pool。

2. 在程序的入口main函数就调用NSAutoreleasePool,这样保证程序中不调用NSAutoreleasePool,但在退出时自动释放。

新开线程最好实现NSAutoreleasePool
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSString* nsstring;
char* cstring = "Hello CString";
nsstring = [NSString stringWithUTF8String:cstring];
[pool release]; NSLog(@”I am %d years old.”i);
正式协议(protocal)可以将业务中的方法定义剥离出来,形成一个单独的文件,这跟传统OO中的提取接口是不谋而合的。

如果遇到二个系统需要交换数据,可以制定一套双方都遵守的protocal,然后这二个系统中都把这个协议文件添加到项目中,实现它即可。

这一功能,非正式协议(@interface)就做不到。

(不信大家可以把NSObject<IQuery>中的IQuery改成其它类的interface 定义名称试试,编译根本通不过)
此外,obj-C 2.0中对正式协议还做了一些扩展,允许把正式协议中的方法标识为“必须实现(@requied)”和“可选实现(@optional)”二类,如果协议中的方法被标识为@optional,即使采用该协议的类不实现这些方法,编译器也不会给出警告。

这赋予了正式协议更多的灵活性。

示例如下:
view sourceprint?
1@protocol IQuery
2
3@required
4-(void) Query:(NSString*) sql;
5
6@optional
7-(void) HelloWorld;
8
9@end
Instance variables
Tread
Interval
文件的加载和保存
Refactor append。

相关文档
最新文档