A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zhangmeng 中级黑马   /  2015-8-25 00:01  /  819 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

一,循环retain问题:
1,什么是循环retain?
    两个类之间互相包含;

        例如:Dog中retain了一个Person,Person中retain了一个Dog;
        @interface Dog : NSObject
        @property (nonatomic,retain) Person *owner;
        @end

        @interface Person : NSObject
        @property (nonatomic,retain) Dog *dog;
        @end

        Person *p = [Person new];
        Dog *d = [Dog new];

        p.dog = d;
        d.owner = p;


2,如何解决循环retain?
    在两端的set方法中,有一端必须使用assign直接赋值,不能用retain;在@property中参数使用assign。

        例如:
        @interface Dog : NSObject
        @property (nonatomic,assign) Person *owner;
        @end

        @interface Person : NSObject
        @property (nonatomic,retain) Dog *dog;
        @end


二,NSString内存管理:
    stringWithFormat(不需要release)
    initWithFormat(需要release)    这两种方式创建的字符串对象是在内存的堆区里面;


    stringWithString(不需要release)
    initWithString(不需要release)    这两种方式创建的字符串对象在内存的常量区里面;


    NSString *str1 = @"abc";(不需要release)   //@"abc" 字符串的常量,存在在常量区


三,自动释放池autorelease的介绍:
    1,自动释放池是程序在运行期间,创建的一些管理对象的池子.这些池子是一种特殊的栈结构.

    2,自动释放池,是如何管理对象内存的?
        在自动释放池自身释放的时候,会对池子中的每个对象发送一次release消息;注意,对每个对象只发送一次release消息;

    3,如何创建一个自动释放池?
        @autoreleasepool {
   
            }
    4,如何将一个对象加入到池子中?
        在池子的代码块中,调用对象的autorelease方法;就可以将这个对象加入到这个池子中.

        例如:
            Person *p = [Person new];
            @autoreleasepool {
                [p autorelease];  //加入自动释放池,
            }



5,autorelease的使用注意:
    1),必须在自动释放池的代码块中调用autorelease方法,对象才会加入池子中;
    2),尽量避免对大内存使用该方法,因为这种是延迟释放机制;
    3),不要把大量循环操作放到同一个 @autoreleasepool 之间,这样会造成内存峰值的上升;
    4),不要对同一个对象连续调用多次autorelease方法;
    5),autorelease和release只能使用一个;


//------------------------下午---------------------------

一,ARC的概念和原理:
1,指针分类:
    (1)强指针:默认的情况下,所有的指针都是强指针,关键字strong;
    (2)弱指针:_ _weak关键字修饰的指针;


2,什么是ARC:
    Automatic Reference Counting,自动引用计数,即ARC;
    ARC是新的LLVM 3.0编译器的一项特性;


3,ARC原理:
    ARC是Objective-C编译器的特性,而不是运行时特性或者垃圾回收机制,ARC所做的只不过是在代码编译时为你自动在合适的位置插入release或autorelease。


4,ARC判断准则:
    (1),只要还有一个强指针变量指向对象,对象就会保存在内存中。
    (2),只要没有强指针指向对象,对象就会被释放。


5,ARC下循环引用问题:
    一端使用strong,一端使用week;



二,ARC下@property参数
ARC中的@property
    strong:    用于OC对象, 相当于MRC中的retain;
    weak:      用于OC对象,释放了之后,会将指针置为nil, 其他相当于MRC中的assign;
    assign:    用于基本数据类型, 跟MRC中的assign一样;
    copy:      一般用于NSString, 跟MRC中的copy一样;


三,ARC使用特点和注意事项:
1、ARC特点总结
    (1)不允许调用release,retain,retainCount;
    (2)允许重写dealloc,但是不允许调用[super dealloc];
    (3)@property的参数:
        strong: 相当于原来的retain(适用于OC对象类型),成员变量是强指针
        weak:   相当于原来的assign,(适用于oc对象类型),成员变量是弱指针
        assign: 适用于非OC对象类型(基础类型)
        copy:   一般用于NSString, 跟MRC中的copy一样

2、ARC使用注意事项
    1)ARC中,只要弱指针指向的对象不在了,就直接把弱指针做清空(赋值为nil)操作。

    2)__weak Person *p=[[Person alloc] init];//不合理,对象一创建出来就被释放掉,对象释放掉后,ARC把指针设置为nil。

    3)ARC中在property处不再使用retain,而是使用strong;
    @property(nonatomic,strong)Dog *dog;
    // 意味着生成的成员变量_dog是一个强指针,相当于以前的retain。




四,ARC和MRC之间互相转换:
1,将MRC工程转为ARC工程:
    用XCode工具: Edit -> Convert -> To Objective-C ARC

2,ARC和MRC之间互转的指令:
    ARC转变为MRC指令, -fno-objc-arc
    MRC转变为ARC的指令, -f-objc-arc


















4 个回复

倒序浏览
受教了!
回复 使用道具 举报
都看到Arc了
回复 使用道具 举报
总结的很全面
回复 使用道具 举报
很详细,学习学习,加油
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马