内存管理(Memory Management)

        内存管理的方式

        垃圾回收机制(gc, garbage collection), 油系统管理内存, 开发人员不需要关心内存, 系统会自动检测, 自动释放, 比如java

        : OC1.0不支持垃圾回收机制, 2.0时支持来及回收机制, 但是在iOS平台上苹果把OC的垃圾回收机制屏蔽掉了

        iOS不支持垃圾回收机制, 如何管理内存?

        通过引用计数(retain count)管理内存

        通过引入计数来管理内存, 有两种方式

        1.MRC, Manual Reference Count, 手动引用计数, 由开发人员通过引入计数来管理内存

       MRC设置

        2.ARC, Automatic Reference Count, 自动引入计数, 由系统通过引入计数来管理内存

        图中行为   OC操作                   OC方法

        开灯      开辟内存空间, 生成对象      alloc/new/copy

        需要照明   持有对象                  retain/copy

        不需要照明释放对象                  release/autorelease

        关灯      回收内存空间, 丢弃对象      dealloc

        : 需要照明的人数, 就是引入计数

        持有: 只要对这个对象做了引用计数+1的操作, 就叫人持有了这个对象

        alloc, 从堆区开辟内存空间

        引用计数: 0变成1

        自己创建的对象, 自己持有

        Light *light = [[Light alloc] init];
        NSLog(@"%lu", light.retainCount);

        retain, 引用计数+1

        持有某个对象

        [light retain];
        NSLog(@"%lu", light.retainCount);

安全使用对象: 先持有, 再使用

        release, 引用计数-1

        不再使用某个对象时, 释放该对象

        [light release];
        NSLog(@"%lu", light.retainCount);
        [light release];//light.retainCount = 0
//        NSLog(@"%lu", light.retainCount);

 僵尸对象

        当对象的引入计数为0, 就不能再使用这个对象了, 如果再使用这个对象, 对象就会变成僵尸对象

        dealloc, 回收内存, 不允许手动调用, 当引用计数变成0时自动调用dealloc方法 

Light.m
#import "Light.h"
@implementation Light
- (void)dealloc
{
    NSLog(@"关灯(回收内存)");
    [super dealloc];
}
@end

        new, 相当于alloc + init

        Light *light1 = [[Light alloc] init];
        Light *light2 = [Light new];
        NSLog(@"%lu, %lu", light1.retainCount, light2.retainCount);
        [light1 release];
        [light2 release];

autorelease, 自动释放, 在未来的某段时间, 引用计数-1

        Light *light3 = [[Light alloc] init];
        [light3 autorelease];
        NSLog(@"%lu", light3.retainCount);

 : 对一个对象使用autorelease操作, 这个对象不回立刻引用计数-1, 而是先放到自动释放池中, 当自动释放池结束, 会对池中的对象依次做引用计数-1

 autoreleasepool只对调用了autorelease的对象起作用

 copy

前提: 必须遵守<NSCopying>协议

        Light *lightA = [[Light alloc] init];
        Light *lightB = [lightA copy];
        NSLog(@"%@", lightA);
        NSLog(@"%@", lightB);
        [lightA release];
        [lightB release];

 浅拷贝: 拷贝指针, 内存地址空间一样

        lightB = [lightA retain];

深拷贝: 拷贝内存空间, 内存地址空间不一样

Light.m- (id)copyWithZone:(NSZone *)zone {
    //zone: 内存空间
    //1.深拷贝
    Light *light = [[Light allocWithZone:zone] init];
    return light;
    //2.浅拷贝
//    return [self retain];
}

内存管理的原则

        1.引用计数+1的操作(alloc, new, copy, retain)的次数 = 引用计数-1的操作(release, autoreleasse)的次数

        2.对象的引用计数变为0就不能使用该对象

        3.谁创建谁释放想使用先持有

        4.当不使用某个对象时要及时释放

        只有堆区的内存需要管理其他由系统管理

        NSString *string = @"辉哥真帅!";
        NSLog(@"%lu", string.retainCount);
        [string release];
        NSLog(@"%lu", string.retainCount);
        [string retain];
        NSLog(@"%lu", string.retainCount);

        NSString *str = [[NSString alloc]initWithFormat:@"辉哥帅的无法形容O(∩_∩)O哈哈哈~"];
        NSLog(@"%lu", str.retainCount);
        [str release];

NSString,创建字符串, 判断常量区内有没有, 如果有就返回常量区的字符串; 如果没有, 就从堆区开辟一块内存区域存放字符串

        NSString *str1 = [[NSString alloc] initWithFormat:@"1234567"];
        NSLog(@"%lu", str1.retainCount);
        [str1 release];
Person.h
#import <Foundation/Foundation.h>
//姓名 性别 年龄
//自定义初始化方法
//便利构造器
//重写description方法
@interface Person : NSObject
//属性的修饰词的默认值
//atomic, assign, readwrite
@property (nonatomic, retain) NSString *name;
@property (nonatomic, copy) NSString *gender;
@property (nonatomic, assign) NSInteger age;
- (instancetype)initWithName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age;
+ (instancetype)personWithName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age;
@end
Person.m
#import "Person.h"
@implementation Person
@synthesize age = _age, name = _name, gender = _gender;
//修饰词是assign的setter和getter的实现
- (void) setAge:(NSInteger)age {
    _age = age;
}
- (NSInteger)age {
    return _age;
}
- (void)dealloc
{
    [_name release];
    [super dealloc];
}
//修饰词是retain的setter和getter的实现
- (void)setName:(NSString *)name {
    if (_name != name) {//判断新对象的地址和原对象的地址是否一致, 如果一致, 就不需要改变; 如果不一致, 才需要改变
        [_name release];//释放原来对象, 拥有新对象
        _name = [name retain];//先持有, 才能安全使用
    }
}
- (NSString *)name {
    return  _name;
}
//修饰词是copy的setter和getter的实现
- (void)setGender:(NSString *)gender {
    if (_gender != gender) {
        [_gender release];
        _gender = [gender copy];
    }
}
- (NSString *)gender {
    return _gender;
}
- (instancetype)initWithName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age {
    if (self = [super init]) {
        _name = name;
        _gender = gender;
        _age = age;
    }
    return  self;
}
+ (instancetype)personWithName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age {
    return [[Person alloc] initWithName:name gender:gender age:age];
}
- (NSString *)description {
    return [NSString stringWithFormat:@"name:%@ gender:%@ age:%ld", _name, _gender, _age];
}
@end
        NSString *nameString = [[NSString alloc] initWithFormat:@"adasfdhgvjhk"];
        Person *person = [[Person alloc] init];
        person.age = 18;
        person.name = nameString;
        [nameString release];
        NSString *nameString1 = [[NSString alloc] initWithFormat:@"dfdfdfdf"];
        person.name = nameString1;
        [nameString1 release];
        [person release];

创建池子的两种写法

写法1

    @autoreleasepool {
        Light *light4 = [[Light alloc] init];
        [light4 autorelease];
    }

写法2

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    Light *light5 = [[Light alloc] init];
    [light5 autorelease];
    [pool release];

 

 

时间: 2024-10-10 17:13:02

内存管理(Memory Management)的相关文章

2015.12.21 内存管理(memory management)

Memory Management 1.什么是内存管理? 程序在运行过程中管理内存分配的过程,当需要内存的时候就申请一片内存空间,不需要就释放掉. 2.如何去管理内存 站在分配对象拥有权的角度来操作内存. 3.内存管理的两种办法 a. MRR(Manual Retain Release)手动管理,实现的机制:reference counting(引用计数机制). b. ARC(Auto Reference Counting)自动引用计数,实现机制:系统在程序编译阶段自动添加了释放对象的办法. 4

Android 内存管理 &amp;Memory Leak &amp; OOM 分析

1.Android 进程管理&内存 Android主要应用在嵌入式设备当中,而嵌入式设备由于一些众所周知的条件限制,通常都不会有很高的配置,特别是内存是比较有限的.如果我们编写的代 码当中有太多的对内存使用不当的地方,难免会使得我们的设备运行缓慢,甚至是死机.为了能够使得Android应用程序安全且快速的运行,Android 的每个应用程序都会使用一个专有的Dalvik虚拟机实例来运行,它是由Zygote服务进程演变过来的,也就是说每个应用程序都是在属于自己的进程中运行的.一方面,如果程序在运行

Objective-C Memory Management Being Exceptional 异常处理与内存

Objective-C Memory Management ? ?Being Exceptional ?异常处理与内存 3.1Cocoa requires that all exceptions must be of type NSException cocoa?需要所有的异常是NSException类型的. so even though you can throw an exception from other objects, Cocoa isn't set up to deal with

SQL Server 2012笔记分享-6:理解内存管理

内存管理 – SQL Server 2005/2008/2008r2 SQL Server 2012以前的版本(SQL 2005/2008/2008R2),有single page allocator 和multi page allocator.也就是说,如果申请的内存是8k以内的,就会有单页分配器分配,而大于8kb的内存请求,使用multi page 分配器来管理.如图所示. 使用select * from sys.dm_os_memory_clerks查询memory clerk,会发现si

操作系统内存管理、Cache调度策略学习

目录 0. 引言 1. 内存管理的概念 2. 内存覆盖与内存交换 3. 内存连续分配管理方式 4. 内存非连续分配管理方式 5. 虚拟内存的概念.特征及其实现 6. 请求分页管理方式实现虚拟内存 7. 页面置换算法 8. 页面分配策略 9. 页面抖动和工作集 0. 引言 在安全攻防产品的研发中,我们会大量用到cache的机制.在学习和使用cache缓存的时候,经常会遇到cache的更新和替换的问题,如何有效对cache进行清理.替换,同时要保证cache在清理后还要保持较高的命中率.通过对比我们

《linux 内核完全剖析》chapter 13 内存管理 (不含swap.c)

内存管理(memory.c 和swap.s 部分) "倒着看" 先看memory management,很明显,前面各种阻力,都是因为涉及内存管理.不先看这个,我估计前面看了也是白看 我估算着理论打基础砸了差不多一个星期的时间在memory management上面了...感觉很有收获,是时候用实践(code)印证理论了! <modern operating system>讲内存管理那一章 http://blog.csdn.net/cinmyheart/article/de

Objective -C Memory Management 内存管理 第一部分

Objective -C Memory Management??内存管理??第一部分 Memory management is part of a more general problem in programming called resource management. 内存管理是资源管理的一部分. Every computer system has finite resources for your program to use. These include memory, open fi

Objective-C Memory Management 内存管理 2

Objective-C Memory Management?内存管理? 2? 2.1 The Rules of Cocoa Memory Management 内存管理规则 (1)When you create an object using new, alloc, or copy, the object has aretain count of 1. You are responsible for sending the object a release or autorelease mess

[Android Memory] Android内存管理、监测剖析

转载自:http://blog.csdn.net/anlegor/article/details/23398785 Android内存管理机制: Android内存管理主要有:LowMemory Killer机制,Ashmem,PMEM/ION及Native内存和Dalvik内存管理管理和JVM垃圾回收机制. LowMemory Killer机制: 源码位置drivers/staging/Android/lowmemorykiller.c Android是一个多任务系统,也就是说可以同时运行多个