zoukankan      html  css  js  c++  java
  • 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;

    }

  • 相关阅读:
    面试题27:二叉树的镜像
    面试题26:树的子结构
    面试题25:合并两个排序的链表
    面试题24:反转链表
    面试题23:链表中环的入口节点
    面试题22:链表中倒数第k个节点
    欧拉函数的使用
    C++ STL 全排列函数详解
    Ubuntu系统安装网易云音乐、搜狗输入法
    Ubuntu系统 安装谷歌 Chrome 浏览器
  • 原文地址:https://www.cnblogs.com/about-zj-blog/p/5302877.html
Copyright © 2011-2022 走看看