`
JavaZhuang
  • 浏览: 10300 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

4 3.OC9-内存管理1-retain和release

    博客分类:
  • IOS
 
阅读更多

4 3.OC9-内存管理1-retainrelease

 

内存管理

范围:

任何继承了NSObject的对象,对基本数据类型无效。

 

原理:

1)、每个对象内部保存了一个与之相关联的整数,称为引用计数器

2)、当使用allocnew或者copy创建一个对象时,对象的引用计数器设置为1

3)、给对象发送一条retain消息,可以使引用计数器值+1

4)、给对象发送一条release消息,可以使引用计数器值-1

5)、当一个对象的引用计数器值为0时,那么它将被销毁,其占用的内存被系统回收,OC也会自动向对象发送一条dealloc消息。一般会重写dealloc方法,在这里释放相关资源。一定不要直接调用dealloc方法。

6)、可以给对象发送retainCount消息获得当前的引用计数器值。

 

 

内存管理原则

1)、谁创建,谁释放(“谁污染,谁治理”)。如果你通过allocnew或(mutablecopy来创建一个对象,那么你必须调用release autorelease。换句话说,不是你创建的,就不用你去释放。

2)、一般来说,除了allocnewcopy之外的方法创建的对象都被声明了autorelease

3)、谁retain,谁release。只要你调用了retain,无论这个对象是如何生成的,你都要调用release

 

例一:

main.m

 //

//  main.m

//  内存管理retianrelease

//

//  Created by qwz on 13-12-9.

//  Copyright (c) 2013 renhe. All rights reserved.

//

 

#import <Foundation/Foundation.h>

#import "Student.h"

 

 

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

{

 

    @autoreleasepool {

        Student *stu = [[Student alloc] init]; //1

        

        [stu release]; //0

        

        //[stu release]; //会发生野指针错误,也就是说访问了不属于你的内存

    }

    return 0;

}

 

Student.h

 //

//  Student.h

//  内存管理retianrelease

//

//  Created by qwz on 13-12-9.

//  Copyright (c) 2013 renhe. All rights reserved.

//

 

#import <Foundation/Foundation.h>

 

@interface Student : NSObject

 

@propertyint age;

 

@end

 

Student.m

 //

//  Student.m

//  内存管理retianrelease

//

//  Created by qwz on 13-12-9.

//  Copyright (c) 2013 renhe. All rights reserved.

//

 

#import "Student.h"

 

@implementation Student

@synthesize age = _age; //xcode5.0环境下是可以省略的

 

- (void) dealloc{

    NSLog(@"%@被销毁了", self);

    

    [superdealloc]; //一定要调用superdealloc方法,而且最好要放在最后面调用

    

}

@end

 

  运行结果

2013-12-09 11:32:58.451 内存管理retianrelease[466:403] <Student: 0x1001144d0>被销毁了

 

 

----------------

例二:

main.m

 //

//  main.m

//  内存管理retianrelease

//

//  Created by qwz on 13-12-9.

//  Copyright (c) 2013 renhe. All rights reserved.

//

 

#import <Foundation/Foundation.h>

#import "Student.h"

 

 

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

{

 

    @autoreleasepool {

        Student *stu = [[Student alloc] init]; //1

        

        //z代表无符号

        NSLog(@"count:%zi", [stu retainCount]);

        

        [stu retain]; //2

        

        NSLog(@"count:%zi", [stu retainCount]);

        

        [stu release]; //1

        

        NSLog(@"count:%zi", [stu retainCount]);

        

        [stu release]; //0

        

        //[stu release]; //会发生野指针错误,也就是说访问了不属于你的内存

    }

    return 0;

}

 

Student.h

 //

//  Student.h

//  内存管理retianrelease

//

//  Created by qwz on 13-12-9.

//  Copyright (c) 2013 renhe. All rights reserved.

//

 

#import <Foundation/Foundation.h>

 

@interface Student : NSObject

 

@propertyint age;

 

@end

 

Student.m

 //

//  Student.m

//  内存管理retianrelease

//

//  Created by qwz on 13-12-9.

//  Copyright (c) 2013 renhe. All rights reserved.

//

 

#import "Student.h"

 

@implementation Student

@synthesize age = _age; //xcode5.0环境下是可以省略的

 

- (void) dealloc{

    NSLog(@"%@被销毁了", self);

    

    [superdealloc]; //一定要调用superdealloc方法,而且最好要放在最后面调用

    

}

@end

 

 运行结果

2013-12-09 10:59:09.977 内存管理retianrelease[447:403] count:1

2013-12-09 10:59:09.987 内存管理retianrelease[447:403] count:2

2013-12-09 10:59:10.002 内存管理retianrelease[447:403] count:1

2013-12-09 10:59:10.012 内存管理retianrelease[447:403] <Student: 0x1001144d0>被销毁了

 

分享到:
评论

相关推荐

    OC 中的内存管理

    1. **手动引用计数**(Manual Retain Count, MRC):这是早期版本的OC使用的内存管理模式,开发者需要显式地调用`retain`、`release`或`autorelease`方法来增加或减少对象的引用计数,从而控制对象的生命周期。...

    oc内存管理.

    Objective-C(OC)内存管理是管理内存的一种方式,主要通过引用计数(retain count)来手动控制对象的生命周期。OC的内存管理机制有别于.Net和Java中的全自动垃圾回收机制,它允许开发者更细致地控制内存使用,但也...

    OC中的内存管理

    在Objective-C(简称OC)编程语言中,内存管理是一个至关重要的概念,因为它直接影响到程序的稳定性和性能。OC主要采用了两种内存管理策略:手动引用计数(MRC)和自动引用计数(ARC)。这两种机制都是为了确保在...

    OC内存管理详解

    ARC自动处理`retain`和`release`操作,开发者无需显式调用这些方法,大大减少了因内存管理不当而导致的内存泄漏和崩溃等问题。然而,值得注意的是,ARC并非真正的垃圾回收机制,它仍然基于引用计数。真正的垃圾回收...

    《深入浅出发Objective-C》 内存管理.pdf

    Objective-C的内存管理也有类似的两种模式,分别是手动管理内存和自动管理内存。 手动管理内存的模式要求开发者亲自分配(alloc)和释放(release)内存,这就像在家做饭后的清理一样。而在Objective-C中,使用...

    对于Retain和Assign属性的理解

    总之,`Retain`和`Assign`是Objective-C中处理对象引用的重要方式,理解它们可以帮助开发者更好地掌握内存管理,避免常见的内存问题,提高代码质量。在转换到Swift时,虽然关键字变了,但内存管理的原则依然不变,...

    OC(完整)内存管理文档(中文)

    ### OC(完整)内存管理文档知识点总结 #### 一、对象的所有权与处理 ##### 1.1 对象所有权原则 - **对象所有权概念**:任何对象都可以有多个所有者,只要至少有一个所有者存在,该对象就会持续存在。若没有所有者...

    OC中内存管理的介绍

    OC中内存管理的介绍 ...在 OC 中,内存管理需要手动进行,需要调用 retain 和 release 方法来管理对象的内存。 OC 中内存管理是一个复杂的 topic,需要遵循一定的规则和规范来避免内存泄露和对象的无效引用。

    简单讲解Objective-C的基本特性及其内存管理方式..pdf

    Retain消息使计数器+1,Release消息使计数器-1,retainCount消息获得对象当前的引用计数器值。 对象的销毁是指当对象的引用计数器为0时,那么它将被销毁,其占用的内存被系统回收。在对象被销毁时,系统会自动向...

    OC学习笔记合集

    2. 手动引用计数(MRC):在没有ARC的年代,程序员需要手动调用`retain`、`release`和`autorelease`来管理内存。 3. 内存区域:Objective-C有堆(Heap)和栈(Stack)两种内存区域,对象通常存储在堆中,基本数据...

    OC-自动释放池的使用

    在ARC环境下,编译器自动处理内存管理,包括对象的`retain`、`release`和`autorelease`。尽管如此,理解自动释放池仍然很重要,因为当需要在循环中创建大量临时对象时,手动创建自动释放池可以优化性能。 总之,OC...

    基于OC语言的学生管理系统(实现了增删查改功能)

    9. **内存管理**:OC使用引用计数进行内存管理,我们需要了解`retain`、`release`和`autorelease`等概念,防止内存泄漏。 10. **异常处理**:在进行数据库操作或其他可能出错的地方,应使用`@try`、`@catch`、`@...

    小议iOS内存管理-中文.pdf

    与Java的自动垃圾回收不同,OC要求开发者手动管理内存,这在一定程度上增加了开发复杂度,但也促使开发者更加注重代码的优化,尤其是在资源受限的移动设备上,力求最小化CPU使用率和内存占用。 #### 二、基本原理...

    【无限互联】iOS开发视频教程课件第1、2章OC基础语法源代码

    - `- (void)retain`、`- (void)release`、`- (id)autorelease`是早期的手动内存管理方式。 9. **异常处理**: - OC使用`@try`、`@catch`、`@finally`进行异常处理。 10. **NSLog**: - `NSLog`是OC中的日志打印...

    内存管理资料.zip

    2. **手动引用计数(Manual Reference Counting, MRC)**:在ARC出现之前,开发者需要手动调用`retain`、`release`和`autorelease`方法来管理内存。理解MRC有助于深入理解内存管理的本质,尤其是在处理循环引用和内存...

    iOS面试题-OC部分

    通过ARC,开发人员不再需要显式地调用`retain`、`release`或`autorelease`方法来管理对象的引用计数,而是由编译器自动插入这些代码。 #### 12. 总结 Objective-C作为iOS开发的基础语言之一,其特性和机制对于深入...

    OC语言疯狂讲义(下

    编译器自动插入`retain`和`release`消息,简化了内存管理。 3. **Garbage Collection (GC)**:垃圾回收机制,虽然目前iOS不支持,但在Mac OS X 10.5及以上版本中曾被支持,通过自动跟踪未使用的对象并释放内存来管理...

    OC学习总结资料

    OC使用引用计数(Reference Counting)进行内存管理,通过`retain`、`release`、`autorelease`来控制对象生命周期。理解ARC(Automatic Reference Counting)的工作原理也很重要,它简化了手动内存管理。 7. **...

Global site tag (gtag.js) - Google Analytics