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

  • 相关阅读:
    Hibernate save, saveOrUpdate, persist, merge, update 区别
    Eclipse下maven使用嵌入式(Embedded)Neo4j创建Hello World项目
    Neo4j批量插入(Batch Insertion)
    嵌入式(Embedded)Neo4j数据库访问方法
    Neo4j 查询已经创建的索引与约束
    Neo4j 两种索引Legacy Index与Schema Index区别
    spring data jpa hibernate jpa 三者之间的关系
    maven web project打包为war包,目录结构的变化
    创建一个maven web project
    Linux下部署solrCloud
  • 原文地址:https://www.cnblogs.com/coolcold/p/4674383.html
Copyright © 2011-2022 走看看