Objective_ C语法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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。