4 3.OC9-内存管理1-retain和release
内存管理
范围:
任何继承了NSObject的对象,对基本数据类型无效。
原理:
1)、每个对象内部保存了一个与之相关联的整数,称为引用计数器
2)、当使用alloc、new或者copy创建一个对象时,对象的引用计数器设置为1
3)、给对象发送一条retain消息,可以使引用计数器值+1
4)、给对象发送一条release消息,可以使引用计数器值-1
5)、当一个对象的引用计数器值为0时,那么它将被销毁,其占用的内存被系统回收,OC也会自动向对象发送一条dealloc消息。一般会重写dealloc方法,在这里释放相关资源。一定不要直接调用dealloc方法。
6)、可以给对象发送retainCount消息获得当前的引用计数器值。
内存管理原则
1)、谁创建,谁释放(“谁污染,谁治理”)。如果你通过alloc、new或(mutable)copy来创建一个对象,那么你必须调用release 或 autorelease。换句话说,不是你创建的,就不用你去释放。
2)、一般来说,除了alloc、new或copy之外的方法创建的对象都被声明了autorelease
3)、谁retain,谁release。只要你调用了retain,无论这个对象是如何生成的,你都要调用release。
例一:
main.m
// // main.m // 内存管理retian和release // // 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 // 内存管理retian和release // // 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 // 内存管理retian和release // // 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]; //一定要调用super的dealloc方法,而且最好要放在最后面调用
} @end |
运行结果:
2013-12-09 11:32:58.451 内存管理retian和release[466:403] <Student: 0x1001144d0>被销毁了 |
----------------
例二:
main.m
// // main.m // 内存管理retian和release // // 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 // 内存管理retian和release // // 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 // 内存管理retian和release // // 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]; //一定要调用super的dealloc方法,而且最好要放在最后面调用
} @end |
运行结果:
2013-12-09 10:59:09.977 内存管理retian和release[447:403] count:1 2013-12-09 10:59:09.987 内存管理retian和release[447:403] count:2 2013-12-09 10:59:10.002 内存管理retian和release[447:403] count:1 2013-12-09 10:59:10.012 内存管理retian和release[447:403] <Student: 0x1001144d0>被销毁了 |
相关推荐
1. **手动引用计数**(Manual Retain Count, MRC):这是早期版本的OC使用的内存管理模式,开发者需要显式地调用`retain`、`release`或`autorelease`方法来增加或减少对象的引用计数,从而控制对象的生命周期。...
Objective-C(OC)内存管理是管理内存的一种方式,主要通过引用计数(retain count)来手动控制对象的生命周期。OC的内存管理机制有别于.Net和Java中的全自动垃圾回收机制,它允许开发者更细致地控制内存使用,但也...
在Objective-C(简称OC)编程语言中,内存管理是一个至关重要的概念,因为它直接影响到程序的稳定性和性能。OC主要采用了两种内存管理策略:手动引用计数(MRC)和自动引用计数(ARC)。这两种机制都是为了确保在...
ARC自动处理`retain`和`release`操作,开发者无需显式调用这些方法,大大减少了因内存管理不当而导致的内存泄漏和崩溃等问题。然而,值得注意的是,ARC并非真正的垃圾回收机制,它仍然基于引用计数。真正的垃圾回收...
Objective-C的内存管理也有类似的两种模式,分别是手动管理内存和自动管理内存。 手动管理内存的模式要求开发者亲自分配(alloc)和释放(release)内存,这就像在家做饭后的清理一样。而在Objective-C中,使用...
总之,`Retain`和`Assign`是Objective-C中处理对象引用的重要方式,理解它们可以帮助开发者更好地掌握内存管理,避免常见的内存问题,提高代码质量。在转换到Swift时,虽然关键字变了,但内存管理的原则依然不变,...
### OC(完整)内存管理文档知识点总结 #### 一、对象的所有权与处理 ##### 1.1 对象所有权原则 - **对象所有权概念**:任何对象都可以有多个所有者,只要至少有一个所有者存在,该对象就会持续存在。若没有所有者...
OC中内存管理的介绍 ...在 OC 中,内存管理需要手动进行,需要调用 retain 和 release 方法来管理对象的内存。 OC 中内存管理是一个复杂的 topic,需要遵循一定的规则和规范来避免内存泄露和对象的无效引用。
Retain消息使计数器+1,Release消息使计数器-1,retainCount消息获得对象当前的引用计数器值。 对象的销毁是指当对象的引用计数器为0时,那么它将被销毁,其占用的内存被系统回收。在对象被销毁时,系统会自动向...
2. 手动引用计数(MRC):在没有ARC的年代,程序员需要手动调用`retain`、`release`和`autorelease`来管理内存。 3. 内存区域:Objective-C有堆(Heap)和栈(Stack)两种内存区域,对象通常存储在堆中,基本数据...
在ARC环境下,编译器自动处理内存管理,包括对象的`retain`、`release`和`autorelease`。尽管如此,理解自动释放池仍然很重要,因为当需要在循环中创建大量临时对象时,手动创建自动释放池可以优化性能。 总之,OC...
9. **内存管理**:OC使用引用计数进行内存管理,我们需要了解`retain`、`release`和`autorelease`等概念,防止内存泄漏。 10. **异常处理**:在进行数据库操作或其他可能出错的地方,应使用`@try`、`@catch`、`@...
与Java的自动垃圾回收不同,OC要求开发者手动管理内存,这在一定程度上增加了开发复杂度,但也促使开发者更加注重代码的优化,尤其是在资源受限的移动设备上,力求最小化CPU使用率和内存占用。 #### 二、基本原理...
- `- (void)retain`、`- (void)release`、`- (id)autorelease`是早期的手动内存管理方式。 9. **异常处理**: - OC使用`@try`、`@catch`、`@finally`进行异常处理。 10. **NSLog**: - `NSLog`是OC中的日志打印...
2. **手动引用计数(Manual Reference Counting, MRC)**:在ARC出现之前,开发者需要手动调用`retain`、`release`和`autorelease`方法来管理内存。理解MRC有助于深入理解内存管理的本质,尤其是在处理循环引用和内存...
通过ARC,开发人员不再需要显式地调用`retain`、`release`或`autorelease`方法来管理对象的引用计数,而是由编译器自动插入这些代码。 #### 12. 总结 Objective-C作为iOS开发的基础语言之一,其特性和机制对于深入...
编译器自动插入`retain`和`release`消息,简化了内存管理。 3. **Garbage Collection (GC)**:垃圾回收机制,虽然目前iOS不支持,但在Mac OS X 10.5及以上版本中曾被支持,通过自动跟踪未使用的对象并释放内存来管理...
OC使用引用计数(Reference Counting)进行内存管理,通过`retain`、`release`、`autorelease`来控制对象生命周期。理解ARC(Automatic Reference Counting)的工作原理也很重要,它简化了手动内存管理。 7. **...