OC内存管理(二)

一:autorelease

1> autorelease原理:将我们创建的对象放到一个对象释放池中(是一个栈区)当池子释放时,会将池子中的对象都做一次release操作(自动释放池存放在一个池子中,就近原则,符合先进后出)

2>自动释放池的创建方式

(1)ios 5.0以前的创建方式

NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];

`````````````````

[pool  release];//[pool drain];用于mac

(2)Ios5.0以后

@autoreleasepool

{//开始代表创建自动释放池

·······

}//结束代表销毁自动释放池

3,类调用类方法中,没有看到引用计数器减一的问题

例如 NSString *s = [NSString stringWithFormat:@“%d”, 10];这个代码中不需要我们手动释放内存,因为在stringWithFormat:方法内部已经完成了引用计数器减1的操作

代码:

好处:不用我们自己管理对象释放的时间

坏处:  不能灵活的释放我们需要释放对象,如果对象的占用的内存大的话,不要使用autorelease。

代码示例:

Person类

#import "Person.h"
#import <Foundation/Foundation.h>
/**
 *  @class
 注意:继承关系中子类头文件不能用@class
 因为子类要继承父类中的所有属性
 */
@interface Person : NSObject

@property (nonatomic, retain) NSString *name;
@property (nonatomic, assign) int age;

- (instancetype)initWithName:(NSString *)name andAge:(int)age;
+ (instancetype)personWithName:(NSString *)name andAge:(int)age;

@end
@implementation Person

- (instancetype)initWithName:(NSString *)name andAge:(int)age
{
    if (self == [super init]) {

        self.name = name;
        self.age = age;
    }
    return self;
}

// 注意:也就是在类调用类方法中,alloc中引用计数器加1,因此需要手动释放,当时我们不能在下面调用release
//      因为刚创建的对象我们就释放,毫无意义,因此我们将它加入到释放池中。由池子来释放
+ (instancetype)personWithName:(NSString *)name andAge:(int)age
{
    /* 用self调用的原因:
        我们为什么不用类名来调用alloc,因为person子类会继承这个方法,如果用Person的话,子类调用会创建父类的对象
     */
    return [[[self alloc] initWithName:name andAge:age] autorelease];
}

- (void)dealloc
{
    self.name = nil;
    NSLog(@"Person ------dealloc");
    [super dealloc];
}

@end

Student类继承Person

#import "Student.h"
#import "Person.h"

@interface Student : Person

@end
@implementation Student

-(void)dealloc
{
    NSLog(@"Student------dealloc");
    [super dealloc];
}

@end

main函数中

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Student.h"
int main(int argc, const char * argv[])
{
    // 按道理说我们在ARC中创建对象的代码必须写在释放池中,因为编译器会将代码加到释放池中
    @autoreleasepool {

        Person *p = [Person personWithName:@"zhangsan" andAge:10];
        Student *s = [Student personWithName:@"lisi" andAge:20];
    }

    return 0;
}

二:ARC内存管理机制 (是编译器的特性,手动写的内存管理代码,编译器帮我们完成,不需要我们再去关心)

1> ARC判断准则:只要没有强指针指向对象,对象就会被释放

2> 指针的分类

默认情况下,所有的指针都是强指针,用关键字_strong修饰

当用__week关键字修饰的指针为弱指针。

_ _weak Person *p=[[Person alloc]  init];//不合理,对象一创建出来就       被释放掉,对象释放掉后,ARC把指针自动清零。

3> 特点:默认ARC中不允许调用retain、release、autorelease、retain count,但可以重写dealloc方法,不过该方法中不能写【super  dealloc],因为

编译器编译时已经帮我们完成了。

@property的参数:

Strong:相当于原来的retain(适用于OC对象类型),成员变量是强指针

Weak:相当于原来的assign,(适用于oc对象类型),成员变量是弱指针

Assign:适用于非OC对象类型(基础类型)

ARC也存在循环引用的问题:造成循环引用的原因,dealloc中无法调用,在dealloc中强指针引用的对象无法释放。

解决的办法:1>头文件中文件包含@class

2,property中的修饰符一端strong,一端week,dealloc中不要我们关心,编译器已经帮我们弄好。

4,将MRC代码转换成ARC代码怎么转换

步骤:1点击Xcode的 Edit

2,选择Edit中的Refactor

3,选择refactor中的convert to Object-c ARC就可以

将ARC转回MRC

步骤:1点击File文件中的Restore snaipshot就可以

时间: 2024-08-24 06:05:04

OC内存管理(二)的相关文章

OC内存管理

OC内存管理 一.基本原理 (一)为什么要进行内存管理. 由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等. 管理范围:任何继承NSObject的对象,对其他的基本数据类型无效. 本质原因是因为对象和其他数据类型在系统中的存储空间不一样,其它局部变量主要存放于栈中,而对象存储于堆中,当代码块结束时这个代码块中涉及的所有局部变量会被回收,指向对象的指针也

OC内存管理-1

栈区:从高到低分配 堆区:从低到高 BSS段:没有初始化的 数据区: 代码段: OC内存管理方式: 1 MRC 手动内存管理 2 ARC 自动内存管理 nil是给对象赋空值 下个有道云笔记 内存管理 一.总结: 1.只有OC对象才需要内存管理,基本数据类型无效 2.OC对象存放在堆里面 3.非OC对象一般放在栈里面(栈内存会被系统自动回收) 二.引用计数器: 1.每个OC对象都有自己的引用计数器 2.它是一个整数(int) 3.表示有多少人正在使用这个对象 4.每个OC对象都有4个字节的存储空间

OC内存管理(一)

OC内存管理: 前言:为什么基本数据类型分配在栈区,而动态分配的内容在堆区. 因为基本数据类型的存放的数据在内存中得大小是固定的比如int类型的数据就是分配-2^31——2^31-1.而要分配不确定的数据在内存中得话,就动态分配到堆区. 一:基本原理 1>为什么要进行内存管理. 内存管理的范围是:继承自NSObjetc的类对象,对基本数据类型无效 我们知道手机的内存非常有限,而基本数据类型在编译时会静态分配内存在栈区,当代码块结束时,栈区的成员变量自动释放,当然指向对象的指针也会被释放.而对象是

OC内存管理相关整理

OC内存管理 一.基本原理 (一)为什么要进行内存管理.内存管理的目的是什么? 由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等. 管理范围:任何继承NSObject的对象,对其他的基本数据类型无效 管理目的: 1.不要释放或者覆盖还在使用的内存,这会引起程序崩溃: 2.释放不再使用的内存,防止内存泄露.(ios程序的内存资源很是宝贵.) 本质原因是因

OC 内存管理机制总结

OC 内存管理机制总结 一:OC内存管理机制目前分为两块,其一自动内存管理机制,其二手动内存管理机制: 1.首先我们从自动内存管理机制讲起: 1)什么是自动内存管理机制,自动内存管理机制就是程序中所创造的成员变量交由系统统一处理,不需要外部人员干预,有点像java中gc(垃圾回收机制). 2)之前是没有自动内存管理机制的,后期苹果想拓展自己的开发市场,吸引其他平台开发者入住ios开发阵营,其中收到内存管理是很发杂的一块,对于转入IOS开发者不利,因此苹果推出了自动内存管理机制. 2.接下来我们将

OC内存管理总结,清晰明了!

<span style="font-size:18px;">OC内存管理 一.基本原理 (一)为什么要进行内存管理. 由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等. 管理范围:任何继承NSObject的对象,对其他的基本数据类型无效. 本质原因是因为对象和其他数据类型在系统中的存储空间不一样,其它局部变量主要存放于栈中,而对象

OC内存管理(转载)

OC内存管理 一.基本原理 (一)为什么要进行内存管理. 由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等. 管理范围:任何继承NSObject的对象,对其他的基本数据类型无效. 本质原因是因为对象和其他数据类型在系统中的存储空间不一样,其它局部变量主要存放于栈中,而对象存储于堆中,当代码块结束时这个代码块中涉及的所有局部变量会被回收,指向对象的指针也

OC内存管理2

这里是新的内容 OC内存管理2,布布扣,bubuko.com

黑马程序员-OC内存管理 @property的增强

涉及到内存管理,只读,多线程等很多功能时,setter和getter方法也就没那么简单了:当然@property依然强大,很好用: 1:内存管理相关参数: *:retain:  (如果是oc对象类型),生成的setter会自动release旧值,retain新值: *:assign:(适用于非oc对象)  这个是默认的值 *:copy:release旧值,copy新值: @property (retain) NSString *name; // 同类型的参数不能同时写 // @property