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

Posted 672530440

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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一样。

以上是关于oc56--ARC多个对象的内存管理的主要内容,如果未能解决你的问题,请参考以下文章

oc 内存管理

OC内存管理续

OC基础--OC内存管理原则和简单实例

[OC学习笔记]内存管理

OC内存管理

39-oc集合中对象的内存管理