oc45--多对象内存管理 优化

//
//  main.m
//  Set方法的内存管理

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Room.h"

int main(int argc, const char * argv[]) {

    @autoreleasepool {
        // 1.创建两个对象
        Person *p = [[Person alloc] init];
        Room *r = [[Room alloc] init];
        r.no = 888;
        NSLog(@"%lu",[r retainCount]);
        // 2.将房间赋值给人
        // 人需要使用这间房, 只要人在房间就一定要在
        p.room = r; // [p setRoom:r]
        p.room = r; // [p setRoom:r]
        p.room = r; // [p setRoom:r]
        p.room = r; // [p setRoom:r]

        NSLog(@"%lu",[r retainCount]);

        [r release]; 

        // 3.换房
        Room *r2 = [[Room alloc] init];
        r2.no = 444;
        // 有问题
        p.room = r2;
        [r2 release];

        // 在这行代码之前, 人都没有被释放
        NSLog(@"-----");

        // 3,人都不在了, 房间也必须销毁
        [p release];
    }
    return 0;
}
//
//  Person.h

#import <Foundation/Foundation.h>
#import "Room.h"

@interface Person : NSObject
{
    Room *_room;
}

- (void)setRoom:(Room *)room;
- (Room *)room;
@end
//
//  Person.m

#import "Person.h"

@implementation Person

// 当A对象想使用B对象一定要对B对象进行一次retain, 这样才能保证A对象存在B对象就存在, 也就是说这样才能保证无论在什么时候在A对象中都可以使用B对象
// 当A对象释放的时候, 一定要对B对应进行一次release, 这样才能保证A对象释放了, B对应也会随之释放, 避免内存泄露
// 总结一句话: 有增就有减

- (void)setRoom:(Room *)room // room = r
{
    // 只有房间不同才需用release和retain
    if (_room != room) {// 0ffe1 != 0ffe1,防止了相同的set会加多次,

        // 将以前的房间释放掉 -1,更换room的时候将之前的room的计数器减一,
        [_room release];

        /*
        对房间的引用计数器+1
        [room retain];
        _room = room;
         */

        // retain不仅仅会对引用计数器+1, 而且还会返回当前对象
        _room = [room retain];
    }
}

- (Room *)room
{
    return  _room;
}

- (void)dealloc
{
    // 人释放了, 那么房间也需要释放
    [_room release];
    NSLog(@"%s", __func__);
    [super dealloc];
}
@end
//  Room.h

#import <Foundation/Foundation.h>

@interface Room : NSObject

    @property int no;// 房间号

@end
//  Room.m

#import "Room.h"

@implementation Room

    - (void)dealloc
    {
        NSLog(@"%s no = %i", __func__, _no);
        [super dealloc];
    }

@end
时间: 2024-10-10 23:21:24

oc45--多对象内存管理 优化的相关文章

C# 内存管理优化畅想(三)---- 其他方法&amp;结语

1. 允许对象“嵌入式”组合:说白了,就是允许一个对象包含其他对象(包含的是对象本身,而非其引用),这样就把多个对象合并成了一个对象,减少了对象的数量,自然GC的压力就轻了.被包含的对象其实就相当于一个结构体(struct),禁止持有其引用.如果被包含对象是数组,至少应允许固定长度的情况,至于是否允许变长,则要看实现的难易程度了. 相关英文贴: https://github.com/dotnet/roslyn/issues/2097 https://github.com/dotnet/rosly

C# 内存管理优化畅想(二)---- 巧用堆栈

这个优化方法比较易懂,就是对于仅在方法内部用到的对象,不再分配在堆上,而是直接在栈上分配,方法结束后立即回收,这将大大减轻GC的压力. 其实,这个优化方法就是java里的逃逸分析,不知为何.net里没有引入. 英文贴:https://github.com/dotnet/roslyn/issues/2104

C# 内存管理优化畅想(一)---- 大对象堆(LOH)的压缩

我们都知道,.net的GC是不会压缩大对象堆的,因为其时间开销不可接受,但这是以大对象堆产生大块碎片为代价的,如果以后要分配的大对象比最大的碎片还大,那么即使它比所有碎片的总大小要小,也是无法在不扩展大对象堆的前提下分配成功的,此时有可能引发内存不足的异常. 我想到一个方案,可以让大对象堆也能压缩,而且时间开销在可接受的范围内,原理是利用页表.我们知道,程序能看到的内存地址都是虚拟地址,是通过页表映射到物理地址的,连续的虚拟地址对应的物理地址未必连续,反之亦然.在内存中移动大量数据,开销很大,因

内存管理 &amp; 内存优化技巧 浅析

内存管理 浅析 下列行为都会增加一个app的内存占用: 1.创建一个OC对象: 2.定义一个变量: 3.调用一个函数或者方法. 如果app占用内存过大,系统可能会强制关闭app,造成闪退现象,影响用户体验.如何让回收那些不再使用的对象呢?本文着重介绍OC中的内存管理. 所谓内存管理,就是对内存进行管理,涉及的操作有: 1.分配内存:比如创建一个对象,会增加内存占用: 2.清除内存:比如销毁一个对象,会减少内存占用. 内存管理的管理范围: 1.任何继承了NSObject的对象: 2.对其他非对象类

内存管理 浅析 内存管理/内存优化技巧

内存管理 浅析 下列行为都会增加一个app的内存占用: 1.创建一个OC对象: 2.定义一个变量: 3.调用一个函数或者方法. 如果app占用内存过大,系统可能会强制关闭app,造成闪退现象,影响用户体验.如何让回收那些不再使用的对象呢?本文着重介绍OC中的内存管理. 所谓内存管理,就是对内存进行管理,涉及的操作有: 1.分配内存:比如创建一个对象,会增加内存占用: 2.清除内存:比如销毁一个对象,会减少内存占用. 内存管理的管理范围: 1.任何继承了NSObject的对象: 2.对其他非对象类

iOS核心语言Objective C语言 —— 内存管理

本分享是面向有意向从事iOS开发的伙伴以及苹果产品的发烧友们,或者已经从事了iOS的开发者,想进一步提升者.如果您对iOS开发有极高的兴趣,可以与我一起探讨iOS开发,一起学习,共同进步.如果您是零基础,建议您先翻阅我之前分享的iOS开发分分钟搞定C语言系列,然后在开始Objective C语言的学习,如果您遇到问题也可以与我探讨,另外将无偿分享自己整理出来的大概400G iOS学习视频及学习资料,都是干货哦!可以新浪微博私信?关注极客James,期待与您的共同学习和探讨!!由于时间有限,每天在

ARC下的内存管理

1.ARC下单对象内存管理 局部变量释放对象随之被释放 int main(int argc, const char * argv[]) { @autoreleasepool { Person *p = [[Person alloc] init]; } // 执行到这一行局部变量p释放 // 由于没有强指针指向对象, 所以对象也释放 return 0; } 清空指针对象随之被释放 int main(int argc, const char * argv[]) { @autoreleasepool

黑马程序员---OC基础7【ARC概念】【ARC对象内存管理】【分类Category】

------- iOS培训.Android培训.Java培训.期待与您交流! ---------- [ARC概念]   1.指针的分类 1)强指针,默认的情况下,所有的指针都是强指针,关键字strong: 2)弱指针,_ _weak关键字修饰符的指针 2.ARC概念 自动引用计数 永远不要写retain和release.autorelease三个关键字 编译器会在编译的时候自动插入retain和release.autorelease, 是一个编译器的特性:“垃圾回收”是运行时的特性 3.ARC工

OC基础 05-手动内存管理(MRC)

---恢复内容开始--- MRC: Manul(手动) Reference(引用) Counting(计数) 什么是手动引用计数? 所有对象的内容都需要我们手动管理, 需要程序员自己编写release/retain等代码 内存管理的原则就是有加就有减 也就是说, 一次alloc/new/copy对应一次release, 一次retain对应一次relese 内存管理的重要性: 移动设备的内存极其有限,每个app的占用内存也是有限制的. 当我们创建一个OC对象,定义一个变量,调用一个函数或者方法,