zoukankan      html  css  js  c++  java
  • 分类和内存管理

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

    使用注意:

    1)分类只能增加方法,不能增加成员变量

    2)分类方法实现中可以访问原来类中声明的成员变量

    3)同名方法,分类的优先级最高(方法重构,覆盖原类中方法)

    4)方法调用优先级:分类—>原类—>父类(后编译的会覆盖先编译的(.h文件不编译))

    二.SEL:

    1)把方法包装成SEL类型的数据

    2)根据SEL数据找到对应的方法地址

    3)根据方法地址调用对应的方法

    4)每个方法都有一个与之对应的SEL类型的对象

    例:[p performSelect:@selector(test:) withObject:@“@123”];

           [p test3:@“123”];

    SEL类型创建:

    SEL s = @selector(test3:);

    NSString *name = @“test2”;

    SEL s = NSSelectorFromString(name);

    [p performSelector:s];

    每个方法中都有一个SEL类型的_cmd变量,代表当前方法。

    NSString *str = NSStrigFromSlelector(_cmd);  //打印方法名

    其实消息就是SEL

    三.内存管理

    1)内存管理的范围:任何继承了NSObject的对象,对其他基本数据类型(int,char,。。。)无效

    2)变量内存:代码块结束时,(栈空间)局部变量销毁(c语言自动回收(检测作用域)),(堆空间动态分配)但对象不回消失,需要手动释放(发送消息)

    3)引用计数器:每个对象都有自己的引用计数器,是一个整数,表示“对象被引用打次数”,即有多少人正在使用这个oc对象(用4个字节来存储引用计数器的值)

    4)引用计数器操作:

    给对象发送retain消息,计数器+1(热态呢方法返回对象本身)

    给对象发送release消息,计数器-1

    可以给对象发送retainCount消息获得当前的引用计数器值

    5)对象的销毁:

    一般会重写dealloc方法来释放相关资源

    dealloc就像对象的遗言(当一个对象被回收时调用)(一定调用[super dealloc],放在最后面)

    6)野指针:指向僵尸对象(所调用内存已经被回收到对象,僵尸对象不能再使用)的指针(指向不可用内存)如果继续访问内存会出现坏访问错误:EXC_BAD_ACCESS(对象死不能复生)

    7)@property生成的set方法是直接赋值,没有管内存,@property (retain) Book *book 自动向set方法添加retain

    8)set方法内存管理相关参数

    1.*retain:release旧值,retain新值(适用于OC对象类型)

       *assign:直接赋值(默认,适用于非OC对象类型)

       *copy:release旧值,copy新值

    2.是否生成set方法

        *readwrite:同时生产setter和getter的申明,实现

        *readonly:只会生成getter的声明,实现

         @property (readwrite, assign) int heightj;

    3.oc对象类型:

    @property(nonatomic, retain) 类名,属性名

    4.非oc对象类型:

    @property(nonatomic, assign)类型名,属性名;

    9)多线程管理

        *nonatomic:性能高

         *atomic:性能低(默认)

    10)setter和getter方法的名称

    *setter:决定了set方法的名称,一定要有个冒号:

    *getter:决定了get方法的名称(一般用在BOOL类型get方法)

    11)当两个类需要互相包含时,不能用在.h中用#import,需要双方都使用@class 类名(告诉编译器这是一个类),可以在.m文件中使用#import来包含接口

    12)当出现两端循环引用解决方案时一端用retain,一端用assign

    13)自动释放池:(延迟了对象的释放时间)

    调用autorelease方法后,对象的计数器不变

    autorelease方法返回对象本身,将对象放到一个自动释放池(创建多层池子之后,按栈方式存储)中,当自动释放池被销毁时,会对池子里面的所有对象做一次release操作,创建方式有大括号方式和

    1.不用在关心对象的释放时间

    2.不用再关心什么时候调用release

    3.占用内存较大的对象不要随便使用autorelease

    注意:release和autorelease只能使用其中一个,不能多次使用 autorelease 

    有时使用类方法快速返回一个autorelease对象,创建对象时不要直接使用类名,一般使用self

    +(id)person{

    return [[[self alloc] init] autorelease];

    }

    系统自带的方法里面没有包含alloc,new,copy,说明返回的对象都是autorelease的

    14)ARC的判断准则:只要没有强指针指向对象,就会释放对象

    指针分两种:

    强指针:默认情况下,所有的指针都是强指针

    弱指针:__weak

    特点:

    1.不允许调用release,retain,retainCount

    2.允许重写dealloc,但不允许调用[supper dealloc]

    3.@property的参数

    *strong:成员变量是强指针(适用于OC对象类型)

    *weak:成员变量是弱指针(适用于OC对象类型)

    *assign:适用于非OC对象类型ying

    如果出现循环引用则一个用__weak另一个用 __strong

    4.以前的retain 改为用strong

    如果文件以前不支持ARC,需要临时支持ARC,需要更改Compile Sources中的文件操作:

    -f-objc-arc  支持ARC

    -fno-objc-arc 不支持ARC

    15)协议

    协议只用来申明方法

    @protorcol MyProtocol

    -(void)test;

    -(void)test;

    16)block

    1)用来保存一段代码

    2)block的标志:^

    例子:

    int sum(int a, int b){

    return a+b;

    }

    int (*p)(int, int) = sum;

    int (^sumblock)(int, int) = ^(int a, int b){

      return a+b;

    };

    int c = sumblock(10, 11);

  • 相关阅读:
    Ubuntu18.04 安装Redis
    前端周刊,给前端同学准备的每周1小时阅读清单
    如何开发第三方小程序组件
    奋斗路上的安全边际,程序员保险配置指南
    为了知道儿子到底胖不胖,做了一个婴幼儿成长标准计算小程序
    Vue组织架构图组件
    最好用的jQuery-Ajax缓存插件
    Vue-Access-Control:前端用户权限控制解决方案
    RESTful学习及应用
    纯前端实现人脸识别-提取-合成
  • 原文地址:https://www.cnblogs.com/coolcold/p/4674383.html
Copyright © 2011-2022 走看看