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;

}

原文地址:https://www.cnblogs.com/about-zj-blog/p/5302877.html