object-c的扩展的关键字

 我来答
爱刷z0020
2016-05-12 · TA获得超过129个赞
知道答主
回答量:173
采纳率:0%
帮助的人:110万
展开全部

类型声明,类似于c++中的class,区别在于Object c中的声明与实现是强制分开的,@interface关键字用于类型的声明,包括数据成员、方法声明、属性等。方法的参数传递采用中缀符的形式,利用“:”分割参数名和被传递参数,类型的声明以@interface开头,以@end结束,通常一个类型的声明采用下面的结构:
@class someOtherObject //外部类型声明
@interfacesomeObject:NSObject //继承的类型
{
int i; //成员变量
}
-(id)someMethod:(int)someArg someOtherArgName:(int)someOtherArg; //对象的方法
+(id)someMethod:(int)someArg; //类方法
-(id)init; //初始化方法
@propertyint num; //属性
@end 对应于@interface的类型声明,@implementation表示一个类型的实现过程,同样以@end结束,实现的格式通常如下:
@implementationsomeObject
-(id)someMethod:(int)someArg someOtherArgName:(int)someOtherArg
{
//实现代码
}
@synthesize num=i; //将属性与变量进行对应
@end Object C中的方法调用形式采用消息发送的方式,通常调用的形式如
[someObject someMethod:firstArg someOtherArgName:otherArg]
实例的初始化也采用消息发送的形式,可以简单的调用类型的new方法来获取一个实例对象,简单实例化的方法通常是:
someObject *obj = [someObjectnew]; //类的实例化
new方法的实际过程是调用alloc和init方法,因此如果需要采用自定义的方法来初始化实例,则需要自己重写init方法,通常的初始化方式为:
someObject *obj = [[someObject alloc] init]; //采用无参数的init实例化
someObject *obj = [[someObject alloc] initWithArg:Arg]; //采用参数的实例化 @class是一个前向引用声明,类似于C++中的friend友元声明,其作用是告诉编译器其后面的字段代表一个类型名称,尽管不知道类型的具体实现,但是只需要将其作为一个类型名称处理即可。通常在使用复合的结构时可以采用@class来减少头文件的相互引用,如果出现循环依赖,则需要依靠@class来避免引用的死循环。通常使用形式为:
@classsomeOtherObject;
@interfacesomeObject:NSObject
{
someOtherObject *obj;
}
@end 尽管可以使用obj->arr的形式去强制读取对象的成员变量,但是良好的编程形式是对外界提供成员变量的读写接口。@property关键字提供了外界对成员变量的访问接口,其本质是为某一个属性提供set和get操作。根据不同的需要,可以添加readonly(只读,相当于只添加get不添加set方法)或者readwrite(读写,如果不添加则为默认);还有三种赋值方式可选 :assign(直接赋值,通常用于基本类型),retain(释放旧值,增加新的retaincount),copy(常用于字符串,生成一个新的拷贝)。通常使用的方式如下:
@interface someObject:NSObject
{
int i; //成员变量
}
@property (assign,readonly) int num; //属性
@end 与@property对应,将一个外在属性与成员变量相关联,定义在@implementation中,如果属性名与变量名一致则可以省略变量名。常用方法:
@implementation someObject
@synthesize num=i;//如果属性名也为i,则可以直接写为 @synthesizei
@end Object C采用引用计数的方式进行内存管理,由于所有的对象都继承于NSObject,因此所有的对象都可以接受NSObject的三个方法:
-(id)retain;
-(void)release;
-(unsigned)retainCount;
retain方法将对象的引用计数加一并返回该对象,release将引用计数减一,retainCount方法返回对象当前的引用计数。当采用new、alloc、copy方法创建一个对象时,它的引用计数被置为1,如果程序中对该对象进行操作,则应根据需要,通过调用retain和release方法来保证该对象在不需要的时候被清除。当一个对象的引用计数被置为0后,系统会自动向对象发送一个dealloc消息,将其占有的资源释放。通常情况下,如果一个对象的初始化过程调用了其他资源,则应该重写改对象的dealloc过程,保证在对象的销毁期正确释放这些资源。
为了更加方便的进行能存管理,cocoa中提供了一个自动释放池(autorelease pool)的概念,每一个类都继承了一个autorelease方法,当调用对象的autorelease方法时,改对象会被加入到开始创建的自动释放池中。当程序进行到不再需要自动释放池中的对象时,将自动释放池释放的时候会向池中的所有对象发送一个release消息,从而保证不再需要的对象被正确的释放。通常的用法如下:
NSAutoreleasePool *pool;
pool = [[NSAutoreleasePool alloc] init];
someObject * obj = [[someObject alloc] init];
[obj autorelease]; //加入自动释放池
//其他代码
[pool release]; //执行该语句时,系统会向池内所有的对象发送release消息;在这个例子中,如果对obj进行的其他retain操作和release操作保持一致的话,则会将obj的引用计数变为0,从而调用它的dealloc方法进行资源释放
Object C进行内存管理的3条规则是: 如果使用new、alloc或copy操作获得一个对象,则该对象的保留计数器值为1 如果通过任何其他方法获得一个对象,则假设该对象的保留计数器值为1,而且已经被设置为自动释放 如果保留了某个对象,则必须保持retain方法和release方法的使用次数相等。 类别是为现有的类提供一个新的方法的方法,即使没有一个类的源代码,仍然可以向类中添加一个方法以方便使用。类别的主要目的有3个:将类的实现分散到多个不同的文件或框架中,创建对私有方法的前向引用,向对象添加非正式协议。
类别的声明方法:
@interfacesomeObject (someProtocal)
-(void)someMethod;
@end
类别的实现方法:
@implementationsomeObject(someProtocal)
-(void)someMethod
{
}
@end Object C中的协议类似于java中的接口,通过@protocol关键字定义一个或多个需要遵从协议的对象实现的方法,协议定义的方法:
@protocolsomeProtocol
-(void)someMethod;
@end
采用协议的方法是在类声明时使用尖括号注明其需要使用的协议:
@interfacesomeObject:NSObject <someProtocol>
在类实现时需要将协议中规定的方法都予以实现。
Object C 2.0增加了2个新的协议修饰符@optional和@required,可以规定协议中的方法是否为必须实现的方法。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式