zoukankan      html  css  js  c++  java
  • OC语言(四)

    二十八.id类型(万能指针)

    可以指向任何id对象(本身就是指针,不用*)

    id相当于NSObject *,类似于一种多态。

    二十九.重写构造方法

    new方法的实质:分配空间+alloc 和 初始化-init

    开发过程一般是用 +alloc 和 -init来进行初始化

    [[Person alloc] init]

    重写init方法:

    在.m里面写
    首先调用父类的构造方法。
    标准写法是 self = [super init]; //super的init返回的是当前类,super的init方法是把isa指向相应的类并返回
    self不为空,则初始化成功。
     - (void)init{
    self = [super init];
    if(self != nil){
    //进行初始化
    }
    return self;
     }

    优化为:

    - (id)init{

        

        if (self = [super init]){ //先赋值完毕并且判断self的值

            //初始化成功

            _age = 1;

        }

        

        return self;

    }


    初始化顺序,先父类,后子类。

    三十.自定义构造方法

    规范:
    1.一定是对象方法,以-开头
    2.返回值一般是id类型
    3.方法名一般以init开头

    实例:

    - (id)initWithName : (NSString*)name{

        

        if(self = [super init]){

            _name = name;

        }

        return self;

    }


    原则:自己的属性由自己的类来处理,要传递则通过super的构造方法。


    三十一.指定Xcode模板

    在路径

    /Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/Project Templates

    下存放的就是各个工程的路径。


    修改Xcode模板注释

    /Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/File Templates/Source/Cocoa Class.xctemplate/NSObjectObjective-C


    三十二.分类(Category)

    使用场景:
    给某一个类扩充一些方法,不修改原来类的代码。
    也分为声明和实现。
    声明:
    @interface <类名>(分类名称)
    @end

    @implementation <类名>(分类名称)
    @end

    创建:OC File ->File Type选择Category

    在需要调用扩充的地方引入category的h文件。

    分类可以把类分模块,一般以模块命名。

    注意事项:
    1.分类只能增加方法,不能增加成员变量。
    2.分类内部可以访问类内的成员变量。
    3.分类的方法会覆盖原来类里的方法!
    找方法的顺序:分类->当前类->父类
    最后参与编译的文件优先

    三十三.应用分类给NSString加功能

    计数NSString的阿拉伯数字个数:

    分为类方法和对象方法两种实现:

    NSString的self即为自身字符串。

    调用方式:

    int count = [NSString numberCountOfString:@"abc12345sjai6ais7as8ds9”];

    [@"asdasd123" numberCountOfString]

    实现方法:

    + (int)numberCountOfString:(NSString *)str{

        int count = 0;

        for(int i = 0; i < str.length; i++){

            unichar c = [str characterAtIndex:i];

            if(c >= '0' && c <= '9'){

                count++;

            }

        }

        return count;

    }


    - (int)numberCountOfString{

        int count = 0;

        for(int i = 0; i < self.length; i++){

            unichar c = [self characterAtIndex:i];

            if(c >= '0' && c <= '9'){

                count++;

            }

        }

        return count;

    }


    三十四.类的本质

    类也是一个对象。类本身是一个Class对象。

    Class对象成为类对象,类对象可以创建实例对象。

    先用Class创建类对象,再用类对象创建实例对象。
    Tip:
    %p是打印地址,Class已经包含*,class方法返回类对象。

    Person *p = [[Person allocinit];

            

    Class c = [p class];

            

    Class c2 = [p class];

            

    Class c3 = [Person class];


    NSLog(@"c1 = %p, c2 = %p, c3 = %p",c,c2,c3);


    可以看到三个地址相同,说明都是指向Person类的。


    类的加载:load方法是在类加载时调用的方法。


    可以发现,先加载父类,再加载子类。


    当程序启动时,就会加载一次项目中所有的类(包括分类),类加载完毕后就会调用+load方法


    先加载父类、再加载子类。


    当第一次使用这个类,会调用+initialize方法(从分类开始找)


    三十五.description方法


    看函数说明:在函数名上按住option键,直到出现问号再点击。

    %@打印对象,默认情况下是打印<类名:地址>

    %@会调用-description方法,返回值是OC字符串(类名+内存地址)。

    应该重写description方法。

    在实现里面重写:

    - (NSString *)description{

        return [NSString stringWithFormat:@"age = %d, no = %d",_age,_no];

    }


    这样就可以用%@来打印类内所有内容了。


    防止死循环:不要在重写的description里面使用self打印%@。


    使用类方法+description:NSLog(@“%@“,[self class]);

    但是+的方法默认不返回地址,仅仅返回类名。


    %p打印&p为打印对象的真实地址


    三十六.NSLog的使用技巧


    __LINE__ 打印当前行号(%d)

    __FILE__ 打印文件完整路径+名字(%s) NSLog打印C语言字符串不允许使用中文!

    __func__ 打印当前函数名(%s)

  • 相关阅读:
    SQL的Demo 由Access改为SQLite
    Delphi10.3ComboBoxEx下拉左边带图标
    uniGUI学习之IconCombobox(53)
    MySQL的图形GUI界面Navicat操作(03)
    delphi10.3安装使用mySQL(02)从SQLite 转移至Mysql
    [转] Java虚拟机原理图解 系列
    [转]ASM插入代码 visitFieldInsn
    [转]大话+图说:Java字节码指令——只为让你懂
    [转]smali语言之locals和registers的区别
    [转]Smali浅析及dex,java互转
  • 原文地址:https://www.cnblogs.com/aiwz/p/6154255.html
Copyright © 2011-2022 走看看