OC_协议与分类的学习
eg:
XYPoint声明文件
#import <Foundation/Foundation.h>
@interface XYPoint : NSObject
{
int x;
int y;
}
-(void)print;
-(void)setX:(int)_x andY:(int)_y;
@end
XYPoint实现文件
#import "XYPoint.h"
@implementation XYPoint
-(void)print
{
NSLog(@"%d %d", x, y);
}
-(void)setX:(int)_x andY:(int)_y
{
x=_x;
y=_y;
}
//注意:不遵循NSCoping协议, 也能实现copy,只要将copyWithZone:方法在实现文件中实现就行,这是OC中的一种动态机制,不过一般情况下我们在编写代码的时候最好加上NSCopyig协议的代码
-(id)copyWithZone:(NSZone*)zone
{
XYPoint* newPoint=[[XYPoint allocWithZone:zone] init];
[newPoint setX:x andY:y];
return newPoint;
}
@end
分类声明文件
#import "XYPoint.h"
//分类声明一般格式:
/*
@interface className(catrgoryName)<protocol,...>
methodDeclaration
methodDeclaration
...
@end
//className:所扩展的类名
//categoryName:(分类名)
//一个类可以有很多分类,这些分类是原有类的一部分,其中的成员也会被原有类
的子类继承,每个分类都需保证是唯一的,分类中不能添加新的实例变量,一般也不推荐重写原有类的方法,在使用分类的时候,只要用原有类声明的对象进行使用便行,不过要导入分类的头文件。
//分类和继承是不允许同时出现的,即在声明分类的时候,是不让分类继承任何类的,但可以
遵循某些协议。
//使用分类注意事项:
1)尽管分类可以访问原始类的实例变量,但是它不能添加自身的任何变量,如果需要添加变量,可以创建子类
2)分类可以重载该类中的一个方法,但通常这种做法不可取,重载之后不能访问原来方法
3)可以拥有很多分类
4)不必实现分类中所有方法
5)通过分类添加新的方法不会影响这个类
c++中布尔型bool, 值为:true和false
oc中, BOOL, YES NO;
*/
@interface XYPoint (XYPointExtention)
-(void)moveTo:(int)_x :(int)_y;
-(void)moveToOrigin;
@end
分类实现文件
#import "XYPoint+XYPointExtention.h"
@implementation XYPoint (XYPointExtention)
-(void)moveTo:(int)_x :(int)_y
{
x=_x;
y=_y;
}
-(void)moveToOrigin
{
x=0;
y=0;
}
@end
main函数
//c++特性
//1)oc里没有c++里的引用&类型
//2)oc没有实现内联
//3)oc没有实现模板
//4)没有实现运算符重载
//5)oc中没有友元
//6)oc没有const函数
#import <Foundation/Foundation.h>
#import "XYPoint.h"
#import "XYPoint+XYPointExtention.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
XYPoint* p=[[XYPoint alloc] init];
[p setX:1 andY:1];
[p moveTo:2 :2];
[p print];
[p moveToOrigin];
[p print];
int i=3;
//在oc中引入了一个新的类型来访问函数,类似于c中的函数指针,是SEL类型;这种“指向函数的指针”被称为一个选择器。 即Selector方法选择器。类型是SEL;其值是用用@selector(待参数的标签的函数)须指定方法可调用
SEL selector1 = @selector(setX:andY:);
//创建方法签名检测器对象:当当前对象所属类进行方法检测(如果有该方法,则用SEL
//选择判断, 进行方法的设置说明,并调用,没有系统返回nil)
NSMethodSignature* sig = [[p class] instanceMethodSignatureForSelector:selector1];
if (sig!=nil) {
NSInvocation* invocation=[NSInvocation invocationWithMethodSignature:sig];
[invocation setSelector:selector1];
[invocation setTarget:p];
[invocation setArgument:&i atIndex:2];
[invocation invoke];
}else
{
NSLog(@"方法不存在");
}
[p release];
p=nil;
NSLog(@"Hello, World!");
}
return 0;
}