与OC相关的一些基础知识(二)
1.OC中创建对象分为两个步骤:为对象分配内存和对内存进行初始化。其格式分别为:id 对象名 = [类名 alloc]; [对象名 init].
2.OC中变量的作用域问题。OC语言支持用public、private和protected对其作用域进行设定。其中默认值为protected,表示在这个类及其派生类中可以访问该变量。public表示这个类以及其派生类,还有类外都可以对该变量进行访问,这是较不安全的。private表示只有这个类可以访问该变量,值得提出的一点是,若父类中有某private变量,则其子类不能对其引用。
3.id。id是一个通用的数据类型,可以用来存储任意类型的对象。
4.类目(categories)。当需要在一个已经定义好的类中增加一些方法而又不想重写该类的时候,可以选择类目进行方法添加。通过categories为该类添加方法,不用创建新的子类或是修改类的源代码。当类目加载之后,新方法(方法)就会变成所有类实例的一部分。需要注意的是:类目不能向类中添加实例变量,虽然类目可以读取要扩展类的实例变量,但类中不会存储类目创建的实例变量。其次,类目可以覆盖类中的方法,但此后用户将无法再调用类中的该方法,用户应该尽量避免覆盖操作。用户可以有许多类目针对一个类,类目会影响该类的子类。
类目的使用过程:ClassA为以下要使用类目和协议的类。
第一步:定义声明类目的文件 category.h,其声明格式:
#import "ClassA.h"
@interface ClassA (category)
-(id) NewMethod;
@end
在以上类目category的声明中,首先使用#import指令导入要扩展的类;然后使用@interface指令,在该指令后接要扩展的类名;再将圆括号中加入类目的名称;然后添加要声明的类目方法,最后以@end结束。
第二步:与类目头文件相对应,需要在类目的实现文件中对类目声明的方法进行实现。category.m代码如下:
#import” category.h“
@implementation ClassA (category)
-(id) NewMethod
{
代码段;
}
@end
之后,就可以像使用本类中的方法一样使用类目中定义的方法啦。
5.协议(protocol)。协议是OC语言中一种 特有的继承方式。协议是一个特殊的方法列表,它声明了一系列方法而不进行实现。协议不是类本身,它们仅仅是定义了其他对象有责任实现的接口。当在自己的类中实现协议的方法时,用户的类就是遵守这个协议的。协议声明的方法可以被任何一个类实现。需要注意的是,协议没有父类,并且协议也不能定义成员变量。
协议的使用过程:
第一步:定义一个协议,以Nprotocol为例。创建一个协议头文件,Nprotocol.h,代码如下所示:
@protocol Nprotocol
-(id) NewMethod;
@end
以@protocol 后面接协议名称开始,下面列出协议的方法,最后以@end结束。
第二步:当某个类要采用协议时,在类的声明中列出该协议的名称就可以了,格式如下:
(在类的声明文件中列出协议,ClassA.h中代码如下)
#import<Foundation/Foundation.h>
#import"Nprotocol.h"
@interface ClassA:Object <Nprotocol(,protocol2...)>
原来的一些代码(不变);
@end
当一个类要采用多个协议时,除了导入相应的协议文件外,还需要在后面的尖括号中以逗号隔开,加入协议名称。协议中的方法已经在协议文件中说明,此处不用再次声明,只需要在要扩展类的实现文件中实现协议中声明的方法即可。
第二步:在类实现文件中,定义实现协议的方法。
ClassA.m中的代码如下:
#import”ClassA.h“
@implementation ClassA
原来的代码;
-(id) NewMethod
{
实现代码;
}
@end
协议的两个修饰符@optional和@required,由修饰符修饰的方法,前者代表采用该协议的类中可以选择不实现该方法,后者代表采用该协议的类必须实现该方法。协议修饰符的默认值为@required,实现。
浙公网安备 33010602011771号