• oc56--ARC多个对象的内存管理


    //  main.m
    //  ARC中多个对象的内存管理:ARC的内存管理就是MRC的内存管理(一个对象释放的时候,必然会把它里面的对象释放),只不过一个是Xcode加的代码,一个是我们自己加的代码;
    //
    //  ARC单个对象的内存管理:不使用的时候就置为nil,该对象没有引用就会立即释放。
    //  MRC的时候,set一个对象的时候就把这个对象retain一次,当这个对象释放的时候就把它的对象属性release一次。
    //
    
    #import <Foundation/Foundation.h>
    #import "Person.h"
    #import "Dog.h"
    int main(int argc, const char * argv[]) {
    
        Person *p = [[Person alloc] init];
        Dog *d = [[Dog alloc] init];
        p.dog = d;
        d.owner = p;
        //d.owner = [[Person alloc] init];
        
        d = nil;  //d = nil才会将d指向的对象里面的计数器减一,d自动销毁时计数器是不会减一的。
        
        NSLog(@"-----");
        
        p = nil;//不使用对象的时候就置位nil。这是ARC的,MRC是A对象释放的时候就把A里面的B对象也释放。
        
        return 0;
    }
    //  Person.h
    
    #import <Foundation/Foundation.h>
    
    @class Dog;
    
    @interface Person : NSObject
    
    // MRC, A对象想拥有B对象, 需要对B对象进行一次retain
    //      A对象不用B对象了, 需要对B对象进行一次release
    //      property的时候进行retain, dealloc的时候进行release
    
    
    // ARC, A对象想拥有B对象, 那么就需要用一个强指针指向B对象
    //      A对象不用B对象了, 什么都不需要做, 编译器会自动帮我们做
    
    
    // 在ARC中保存一个对象用strong, 相当于MRC中的retain
    @property(nonatomic, strong)Dog *dog;
    
    @end
    //
    //  Person.m
    #import "Person.h"
    
    @implementation Person
    
    
    - (void)dealloc
    {
        NSLog(@"%s", __func__);
    }
    @end
    //
    //  Dog.h
    
    #import <Foundation/Foundation.h>
    
    @class Person;
    
    @interface Dog : NSObject
    
    @property(nonatomic, strong)Person *owner;
    //@property(nonatomic, assign)Person *owner;// 在ARC中如果保存对象不要用assign, 用weak,assign是专门用于保存基本数据类型的, 如果保存对象用weak
    
    //@property(nonatomic, weak)Person *owner;   用于a,b对象的相互引用。
    @end
    //
    //  Dog.m
    
    #import "Dog.h"
    
    @implementation Dog
    - (void)dealloc
    {
        NSLog(@"%s", __func__);
    }
    @end

    ARC中的string,相当于MRC中的retain

    ARC中的weak,相当于MRC中的assign

    ARC中的assign,用于基本数据类型,跟MRC中的assign一样。

  • 相关阅读:
    PKI的签密体制学习(含信息安全基础)
    Linux软件安装
    Linux基础
    JSP EL表达式入门1
    Tomcat 错误: 代理抛出异常错误: java.rmi.server.ExportException: Port already in use: 1099 解决方法
    JSP JSTL入门
    JSP组件
    JSP动作
    实现序列化的java类中的serialVersionUID的作用
    [Noip2016]蚯蚓
  • 原文地址:https://www.cnblogs.com/yaowen/p/7435404.html
Copyright © 2020-2023  润新知