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一样。

时间: 2024-12-10 06:47:03

oc56--ARC多个对象的内存管理的相关文章

黑马程序员---OC基础6【内存管理】【手动内存管理】【单、多个对象的内存管理】【*@property参数】【@class的使用】【NSString类的内存管理】【autorelease使用】

------- iOS培训.Android培训.Java培训.期待与您交流! ---------- [内存管理] 1.内存管理概念 由于移动设备内存及其有限,所以每个app所占的内存也是有限的 需要回收一些不使用的空间 2.OC内存管理的范围 管理任何继承NSOject的对象,对其他的基本数据类型无效 主要管理堆区中的对象的内存管理   3.内存管理的原理 1)对象所有权概念 任何对象都可以能拥有一个或多个所有者,只要一个对象至少还拥有一个所有者,他就会继续存在 cocoasu所有权策略 任何自

block没那么难(三):block和对象的内存管理

本系列博文总结自<Pro Multithreading and Memory Management for iOS and OS X with ARC> 在上一篇文章中,我们讲了很多关于 block 和基础变量的内存管理,接着我们聊聊 block 和对象的内存管理,如 block 经常会碰到的循环引用问题等等. 获取对象 照例先来段代码轻松下,瞧瞧 block 是怎么获取外部对象的 /********************** capturing objects **************

ARC下需要注意的内存管理

ARC下需要注意的内存管理 2016/04/03 · iOS开发 · 内存管理 分享到:1 原文出处: 一不(@luoyibu) 之前发了一篇关于图片加载优化的文章,还是引起很多人关注的,不过也有好多人反馈看不太懂,这次谈谈iOS中ARC的一些使用注意事项,相信做iOS开发的不会对ARC陌生啦.这里不是谈ARC的使用,只是介绍下ARC下仍然可能发生的内存泄露问题,可能不全,欢迎大家补充. Ps:关于ARC的使用以及内存管理问题,强烈建议看看官方文档,里面对内存管理的原理有很详细的介绍,相信用过M

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

集合中对象的内存管理 集合的内存管理原则是什么 当把一个对象添加到集合中时,这个对象会做了一次retain操作,计数器会+1 当一个集合被销毁时,会对集合里面的所有对象做一次release操作,计数器会-1 当一个对象从集合中移除时,会对这个对象做一次release操作,计数器会-1 集合方法的普遍规律是什么 如果方法名是add\insert开头,那么被添加的对象,计数器会+1 如果方法名是remove\delete开头,那么被移除的对象,计数器-1

小白学开发(iOS)OC_ 单个对象的内存管理(2015-08-02)

// //  main.m //  单个对象的内存管理 // //  Created by admin on 15/8/3. //  Copyright (c) 2015年 admin. All rights reserved. // #import <Foundation/Foundation.h> #import "Person.h" void test(); void test5(Person * p); int main(int argc, const char *

小白学开发(iOS)OC_多个对象的内存管理(2015-08-03)

// //  main.m //  多个对象的内存管理 // //  Created by admin on 15/8/5. //  Copyright (c) 2015年 admin. All rights reserved. // #import <Foundation/Foundation.h> //  人拥有一辆汽车 #import "Person.h" int main(int argc, const char * argv[]) { @autoreleasepo

黑马程序员-oc对象的内存管理

oc没有java的垃圾回收机制,所以对象的内存释放很重要,基本数据类型,我们不用理会,编译器会处理: oc的每个对象内部都由一个计数器,用来记录当前有几个指针在指向该对象:当计数器为0时该对象会从内存中释放: 相关方法和概念: 1:retain:对象方法,调用该对象方法,计数器+1,有返回值,返回对象本身: 2:release:没有返回值,计数器-1: 3:retainCount:获取当前计数器的值: 4:dealloc:当对象被回收时,就会调用该方法,覆盖该方法时一定要调用[super dea

多个对象的内存管理分析

// //  main.m //  03-多个对象的内存管理分析 // //  Created by apple on 14-3-17. // // #import <Foundation/Foundation.h> //人拥有一辆汽车 #import "Person.h" //1.野指针问题 //2.内存泄漏问题 int main(int argc, const char * argv[]) { @autoreleasepool { // 1 Person * p = [

oc55--ARC单个对象的内存管理

// Person.h #import <Foundation/Foundation.h> @interface Person : NSObject @end // Person.m #import "Person.h" @implementation Person - (void)dealloc { NSLog(@"%s", __func__); // [super dealloc]; //ARC不准写 } @end // // main.m // A