• 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)

  • 相关阅读:
    生成器
    各种表达式
    迭代器
    闭包函数及装饰器
    名称空间及作用域
    函数的嵌套
    函数对象
    OpenSSL Heartbleed “心脏滴血”漏洞简单攻击示例
    PHP函数usort是咋回事?还能当后门?
    CVE-2017-7269—IIS 6.0 WebDAV远程代码执行漏洞分析
  • 原文地址:https://www.cnblogs.com/aiwz/p/6154255.html
Copyright © 2020-2023  润新知