• Objective--C三大特性:封装,继承,多态(零碎笔记)


    OC中类的特性共有有三个,它们分别是封装、继承和多态。

    封装:封装就是对类中的一些字段,方法进行保护,不被外界所访问到,有一种权限的控制功能。

    OC中有四种访问权限修饰符:@public、@protected、@private、@package

    要注意的是:OC中的方法是没有修饰符的概念的,这个和Java有很大的区别,一般都是公开访问的,即public的,但是我们怎么做到让OC中的一个方法不能被外界访问呢?

    OC中是这么做的,如果想让一个方法不被外界访问的话,只需要在.m文件中实现这个方法,不要在头文件中进行定义,说白了就是:该方法有实现,没定义,这样外界在导入头文件的时候,是没有这个方法的,但是这个方法我们可以在自己的.m文件中进行使用。(和IOS中的单例模式有关)

    继承:继承是类中的一个重要的特性,他的出现使得我们没必要别写重复的代码,可重用性很高。

    1、成员变量的作用域。成员变量的作用域应该也是封装的一种,它对成员变量的作用范围做出了一些限制。

    @public : 在任何地方都可以直接访问成员变量。

    @protected:在本类和子类中可以直接访问。

    @private:只能在本类中访问。

    @package:在同一个框架内可以访问。

    默认情况下在类的声明中定义的成员变量的修饰符是@protected,在类的实现中定义的成员变量的修饰符是@private。

    总结:(1)封装是为了保护类中的属性,不让外界直接对属性进行访问和赋值。但是我们可以利用set和get来对属性进行赋值和取值。

    (2)set方法里可以写上对属性的判断,以免我们输入一些不合理的值给属性。

    (3)成员变量的作用域的修饰符有四种,默认情况下在类的声明中定义的成员变量的修饰符是@protected,在类的实现中定义的成员变量的修饰符是@private。

    2、继承有什么好处和坏处?

    好处:1)我们可以明确的表示两个类之间的关系。2)子类可以继承父类的属性和方法,提高了代码的复用率。

    坏处:会增加程序的耦合性。也就是说当有一天我们如果删除了父类,那么子类也将不能再使用,这就是继承的缺点。

    3、继承的注意点:

    1)父类必须声明在子类的前面。

    2)子类的不能重写成员变量,因为子类中不允许有跟父类同名的成员变量。

    3)继承不是两个类有相同的属性和方法就可以确定继承关系的。比如说狗中有名字和年龄属性,还有跑和吃饭的方法,这些属性和方法人也可以拥有,但是可以让人继承狗这个类嘛,所以继承还要考虑事物之间的关系。

    4、多态的特点:

    1)没有继承就没有多态。

    2)父类类型的变量不能直接调用子类的方法,必须要强制转化为子类类型才可以。

    3)如果函数和方法形参列表中是父类的类型,则可以传入父类或子类的对象。

    上面就是继承和多态的介绍。

    总结:

    (1)继承是指一个类完全地拥有另一个类的属性和方法。

    (2)继承时子类可以重写父类的方法,如果要调用父类的方法,可以用super。

    (3)继承不可以乱用,我们要理解两个类之间的关系,不是一个类有了另一类的属性和方法就可以继承的。

    (4)继承只允许单继承,不能够同时继承多个类。

    (5)多态是在继承的基础上实现的。

    (6)多态可以在运行时根据对象的类型动态调用方法。

    (7)多态不可以直接调用子类的属性和方法。

    内存管理总结:

    1、OC中是需要进行内存管理的,内存管理的范围是任何OC对象。

    2、有alloc就一定要有release,有retain就一定要有release。

    3、引用计数器占用四个字节,它是用来表示对象被引用的次数的,如果为0系统就会自动释放内存。

    4、对象引用另一个对象的时候,要在set方法里面写该对象的retain,在dealloc中写上该对象的release。

    5、@property的参数有很多,对于基本数据类型的变量我们写上 nonatomic和assign,对于OC对象我们写上nonatomic和assign。其中nonatomic是高性能的意思,它用在多线程管理 上,assign是直接赋值的意思,retain是release旧值,retain新值的意思。

    构造方法的几个重点:

    1、如果需要在初始化的时候就给成员变量赋值,我们就要重写init方法,也就是构造方法。

    2、重写构造方法的时候一定要调用父类的构造方法。

    3、设计构造方法的时候记得父类的属性交给父类处理。

    4、构造方法必须是对象方法。

    SEL其实是对方法的一种包装,它是将方法包装成一个SEL类型的数据,根据这个数据我们可以找到对应的方法地址。SEL也就是消息。下面我们根据SEL来调用对象的方法。

    // Person类的实现

    @implementation Person

    - (void)eat

    {

        NSLog(@"%@在吃饭", _name);

    }

    @end

    int main()

    {

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

        p.name = @"张三";

       

        [p performSelector:@selector(eat)]; // 把方法名包装成一个SEL类型的数据并进行调用

       

        return 0;

    }

    description是什么呢?它有两种,一种是类方法,一种是对象方法。

    1、使用NSLog和%@输出某个对象时,会调用对象的-description方法,并拿到返回值进行输出。返回值是:<类名: 对象地址>。

    2、使用NSLog和%@输出某个类对象时,会调用类对象+description方法,并拿到返回值进行输出。返回值是:类名。

    我们可以重写description方法来让对象名和类对象名输出我们想要的结果。比如说:

    // Person类的实现

    @implementation Person

    - (void)eat

    {

        NSLog(@"%@在吃饭", _name);

    }

     

    // 重写description方法返回我们需要的东西

    - (NSString *)description

    {

        return [NSString stringWithFormat:@"_name = %@", _name];

    }

    @end

     

    int main()

    {

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

        p.name = @"张三";

       

        NSLog(@"%@", p); // 输出结果是:_name = 张三

       

        return 0;

    }

  • 相关阅读:
    Sign APK without putting keystore info in build.gradle
    Sign APK without putting keystore info in build.gradle
    Sketch教程
    Sketch教程
    简要分析unity3d中剪不断理还乱的yield
    简要分析unity3d中剪不断理还乱的yield
    iOS开发系列--地图与定位总结
    iOS开发系列--地图与定位总结
    Launch Screen在iOS7/8中的实现
    linux 命令随笔 ls cd pwd mkdir rm mv cp cat nl
  • 原文地址:https://www.cnblogs.com/songlei0601/p/5751193.html
Copyright © 2020-2023  润新知