zoukankan      html  css  js  c++  java
  • OC语言类的深入和分类

    OC语言类的深入和分类

    一、分类

    (一)分类的基本知识

      概念:Category 分类是OC特有的语言,依赖于类。

      分类的作用:在不改变原来的类内容的基础上,为类增加一些方法.

      添加一个分类:

      

      

      文件构图

      

      在分类中添加一个方法:

        

      Study方法的实现

      

      测试程序

      

    (二)分类的使用注意

      1>分类只能增加方法(包括类方法和对象方法),不能增加成员变量

      2>在分类方法的实现中可以访问原来类中的成员变量

      3>分类中可以重新实现原来类中的方法,但是会覆盖掉原来的方法,导致原来的方法无法再使用(警告)

      4>方法调用的优先级:分类>原来的类>父类,若包含有多个分类,则最后参与编译的分类优先

      5>在很多的情况下,往往是给系统自带的类添加分类,如NSObject和NSString,因为有的时候,系统类可能并不能满足我们的要求

      6>在大规模的应用中,通常把相应的功能写成一个分类,对原有类进行扩充,一般分模块写,一个模块一个分类

    (三)分类变成练习

      1>给NSString类增加一个类方法,计算某个字符串对象中阿拉伯数字的个数

      2>给NSString类增加一个对象方法,计算该字符串中阿拉伯数字的个数

        分析:遍历字符串,截取字符判断其是否在0~9之间

      结构图:

      

      分类中方法的声明:

      

    #import <Foundation/Foundation.h>
    
    @interface NSString (NumberOfStr)
    
    /**
     *  声明一个类方法,计算字符串中阿拉伯数字的个数
     *
     *  @param str 字符串
     *
     *  @return 
     */
    +(int)NumberOfStr:(NSString *)str;
    
    /**
     *  声明一个对象方法,计算该字符串中阿拉伯数字的个数
     *
     *  @return
     */
    -(int)NumberOfStr2;
    
    @end

      分类中方法的实现

    #import "NSString+NumberOfStr.h"
    
    @implementation NSString (NumberOfStr)
    #pragma mark - 计算一个字符串中阿拉伯数字的个数的类方法
    
    +(int)NumberOfStr:(NSString *)str{
    
        //遍历字符串,截取字符判断其是否在0~9之间
        int count=0;
        for(int i=0;i<str.length;i++){
            //取出字符串i位置的字符
            char c=[str characterAtIndex:i];
            //判断c是否在0~9之间,注意这里c是字符,需要使用单引号
            if(c>'0' && c<'9'){
                count++;
            
            }
        
        }
        return count;
    }
    
    
    #pragma mark - 计算一个字符串中阿拉伯数字的个数的对象方法
    -(int)NumberOfStr2{
    
        //遍历字符串,截取字符判断其是否在0~9之间
        int count=0;
        for (int i=0;i<self.length; i++) {
            //取出字符串i位置的字符
            char c=[self characterAtIndex:i];
            ////判断c是否在0~9之间,注意这里c是字符,需要使用单引号
            if (c>='0' && c<='9') {
                count++;
            }
        }
        return count;
    
    }
    
    @end

      主程序测试

    #import <Foundation/Foundation.h>
    #import "NSString+NumberOfStr.h"
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            //调用分类中实现的类方法
            int count=[NSString NumberOfStr:@"你1好2世3界4"];
            NSLog(@"%d",count);
            
            
            //调用分类中实现的对象方法
            int count1=[@"0你1好2世3界4" NumberOfStr2];
            NSLog(@"%d",count1);
            
        }
        return 0;
    }

    二、类的深入研究

    (一)类的本质

      1>类本身也是一个对象,是class类型的对象,简称"类对象".

      2>class类型的定义:

        Typedef struct obj class *class;

        类名就代表着类对象,每个类只有一个类对象

        利用class创建Person类

        利用Person创建Person类型的对象

        Person *p=[[Person alloc] init];

      3>获取内存中的类对象有两种方法:

        class c=[p class]; //指向类的对象的指针调用class方法

        class c1=[Person class]; //使用类名调用class方法

      注意:c跟c1打印出来的地址相同,可以证明所有的对象共用一个类方法.

     

  • 相关阅读:
    SIMPLE QUERY几个原则
    [POI2014]DOO-Around the world
    Java 实现 蓝桥杯 历届试题 分糖果
    or小计
    luoguP1357 花园
    like小计
    [NOI2016]区间
    complex query几个原则
    AGC 018E.Sightseeing Plan——网格路径问题观止
    排查一般MySQL性能问题
  • 原文地址:https://www.cnblogs.com/my-garden/p/5458196.html
Copyright © 2011-2022 走看看