OC基础  内存管理

我们所了解的c语言内存管理,如下:

(1)c语言的内存分配:char *p = (char*)malloc(100*sizeof(char));

(2)c语言的内存释放:free(p);

c语言内存管理存在的缺陷:

(1)不释放就会造成内存泄露。

(2)多次释放就会造成崩溃。

(3)大型项目中多人对一块内存进行操作时,不能释放内存,因为不知道别人是否还在使用。

oc语言的内存管理

1.内存管理

(1)引用计数。

(2)内存管理的黄金法则:谁创建谁释放。

让我们来看一下测试例子:

#import <Foundation/Foundation.h>
#import "Student.h" int main(int argc, const char * argv[])
{ @autoreleasepool { //内存管理
//用引用计数来管理:
//alloc/retain/copy 引用计数加1
//release引用计数减1
//只有使用过alloc/retain/copy,才能调用release //内存管理的黄金法则--谁创建谁释放 Student *stu = [[Student alloc] init];
[stu retain];
[stu retain];
NSLog(@"%ld",[stu retainCount]);
Student *stu4 = [stu copy];
NSLog(@"%ld",[stu retainCount]);
NSLog(@"%ld",[stu4 retainCount]);
NSLog(@"%p",stu);
NSLog(@"%p",stu4); }
return ;
}

测试结果:

2.类的复合中使用setter

Student类,Student.h文件:

#import <Foundation/Foundation.h>

@interface Student : NSObject

@end

Student.m文件:

#import "Student.h"

@implementation Student

-(NSString *)description
{
return @"我是学生";
} @end

Teacher类,Teacher.h文件:

#import <Foundation/Foundation.h>
#import "Student.h" @interface Teacher : NSObject
{
Student *_stu;
} -(void)setStu:(Student *)stu; -(Student *)getStu; -(void)printf; @end

Teacher.m文件:

#import "Teacher.h"

@implementation Teacher

//错误方法1:
//因为stu对象释放掉时,teacher内的_stu就指向了一个未知地址,不再指向原来的stu,所以stu需要retain,得到错误方法2
//-(void)setStu:(Student *)stu
//{
// _stu = stu;
//} //错误方法2:
//因为用另外一个stu2对象赋值的时候,原先的_stu指向的stu1内存地址不会被释放,造成内存泄漏.所以在retain之前需要先释放掉旧的地址空间,得到错误方法3
//-(void)setStu:(Student *)stu
//{
// _stu = [stu retain];
//} //错误方法3:
//假如调用setStu传入的对象指针是同一个对象,那么[_stu release]之后,stu指向的内存地址的引用计数已经变为0,内存被释放,无法再retain,所以得到正确的方法4
//-(void)setStu:(Student *)stu
//{
// [_stu release];
// _stu = [stu retain];
//} //正确的方法4
//release和retain都要放在if的语句块内,否则也会造成内存泄漏
-(void)setStu:(Student *)stu
{
if(_stu != stu)
{
[_stu release];
_stu = [stu retain];
}
} -(Student *)getStu
{
return _stu;
} -(void)printf
{
NSLog(@"%@",_stu);
} @end

3.数组的内存管理

数组的内存管理,同样使用内存的黄金法则:

(1)当我们创建数组的时候,数组会对每个对象进行引用计数加1。

(2)当我们把数组销毁的时候,数组会对每个对象引用计数减1。

(3)当我们给数组添加对象的时候,会对对象进行引用计数加1。

(4)当我们给数组删除对象的时候,会对对象进行引用计数减1。

总而言之,谁创建谁释放,遵守内存的黄金法则。

测试例子:

#import <Foundation/Foundation.h>
#import "Student.h" int main(int argc, const char * argv[])
{ @autoreleasepool { //数组创建时:对象指针指向的内存地址引用计数加1
//数组读取对象时:引用计数不变。 Student *stu1 = [[Student alloc] init];
Student *stu2 = [[Student alloc] init]; NSArray *array = [[NSArray alloc] initWithObjects:stu1,stu2, nil]; Student *stu3 = [array objectAtIndex:];
NSLog(@"%ld",[stu1 retainCount]);
NSLog(@"%ld",[stu3 retainCount]); NSLog(@"%p",stu1);
NSLog(@"%p",stu3); } return ;
}

测试结果:

4.自动释放

(1)系统自动释放池:在runloop循环时,系统判断系统自动释放池内的对象的引用计数,如果为1并且持有对象-1时,就释放对象,不为1时,如果持有对象-1,引用计数就-1,否则引用计数不变。

(2)自定义的自动释放池,当自动释放池结束时,释放自动释放池内的对象。

OC基础 内存管理的更多相关文章

  1. OC基础--内存管理中的@property关键字以及其参数

    在上一篇博客中整理的内存管理,管理类的代码量会感觉很大,而且如果对象多的话,感觉到代码有点冗余.下面就介绍Xcode中为我们自动生成内存管理代码的关键字@property 例如:在Person这个类中 ...

  2. 【OC语法快览】四、基础内存管理

    Basic Memory Management                                                           基础内存管理 If you're w ...

  3. 12.Object-C--浅谈OC的内存管理机制

    昨天学习了OC的内存管理机制,今天想总结一下,所以接下来我要在这里bibi一下:OC的内存管理. 首先我要说的是,内存管理的作用范围. 内存管理的作用范围: 任何继承了NSObject的对象,对其他基 ...

  4. 黑马程序员——OC的内存管理学习小结

    内存管理在Objective-C中的重要性就像指针在C语言中的重要程序一样. 虽然作为一门高级语言,但OC却没有内存回收机制.这就需要开发者来对动态内存进行管理.OC中内存管理的范围是:任何继承了NS ...

  5. OC:内存管理、dealloc方法、copy知识点

    属性的声明:使⽤@property声明属性
 例如:@property NSString *name: 相当于@interface中声明了两个⽅法(setter.getter): 属性的实现:使⽤@s ...

  6. OC的内存管理机制

    总的来说OC有三种内存管理机制,下面将分别对这三种机制做简要的概述. 1.手动引用计数(Mannul Reference Counting-MRC) mannul:用手的,手工的. 引用计数:reta ...

  7. OC的内存管理(一)

    在OC中当一个APP使用的内存超过20M,则系统会向该APP发送 Memory Warning消息,收到此消息后,需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等,否则程序会 ...

  8. OC基础:内存(内存管理) 分类: ios学习 OC 2015-06-25 16:50 73人阅读 评论(0) 收藏

    自动释放池: @autoreleasepool { } 内存管理机制       谁污染,谁治理 垃圾回收机制:gc(Garbage collection),由系统管理内存,开发人员不需要管理. OC ...

  9. Objective-C基础笔记(3)OC的内存管理

    Objective-C的内存基本管理 在OC中每一个变量都保存着引用计数器,当这个对象的引用计数器为0的时候该对象会被回收.当使用alloc.new或者copy创建一个对象的时候,对象的引用计数器被置 ...

随机推荐

  1. HTML5 Canvas 中的颜色、样式和阴影的属性和方法

    颜色.样式和阴影的属性与方法 fillStyle                设置或返回用于填充绘画的颜色.渐变或模式 strokeStyle         设置或返回用于笔触的颜色.渐变或模式 ...

  2. 在线支付接口之PHP支付宝接口开发简单介绍

    php100:92:在线支付接口之PHP支付宝接口开发 支付接口一般是第三方提供的代收款.付款的平台,可以通过支付接口帮助企业或个人利用一切可以使用的支付方式.常见支付平台:支付宝.快钱.云网支付.财 ...

  3. Asp.net core与golang web简单对比测试

    最近因为工作需要接触了go语言,又恰好asp.net core发布RC2,就想简单做个对比测试. 下面是测试环境: CPU:E3-1230 v2 内存:16G 电脑有点不给力 操作系统:Centos7 ...

  4. 02 - 替换SetInput方法 VTK 6.0 迁移 (2013-06-30 16:22)

    VTK6 引入了许多不兼容的变化,这其中就包括用SetInputData()和SetInputConnection()替换SetInput()方法.在先前的版本中,VTK4 引入了SetInput() ...

  5. MyBatis查询两个字段,返回Map,一个字段作为key,一个字段作为value的实现

    1. 问题描述 在使用MyBatis,我们经常会遇到这种情况:SELECT两个字段,需要返回一个Map,其中第一个字段作为key,第二个字段作为value.MyBatis的MapKey虽然很实用,但并 ...

  6. PL/SQL 0.几秒出结果,SQL效率一定高吗?

    今天开发问我一个问题,PL/SQL很快出结果了,为什么应用还是很慢 create index F_AGT_SAVB_ACCTINFO_H_idx4 on F_AGT_SAVB_ACCTINFO_H ( ...

  7. 动态SQL使用绑定变量

    SQL> begin   for i in 1..1000000    loop     execute immediate 'insert into p1 values(i)' ;     c ...

  8. iOS 定位服务、通讯录、日历、提醒事项、照片、蓝牙共享、麦克风、相机等授权检测

    金田 iOS系统版本的不断升级的前提,伴随着用户使用设备的安全性提升,iOS系统对于App需要使用的硬件限制也越来越严格,App处理稍有不妥,轻则造成功能不可用用户还不知道,重则会造成App Cras ...

  9. 【转】ActionBar的基本用法

    原文网址:http://irtutsk.iteye.com/blog/2117707 ActionBar的组成: [1]AppIcon:标题区,显示应用程序图标和标题,也可以自定义. [2]ViewC ...

  10. Android显示表情对话框

    final EditText editface=(EditText) this.findViewById(R.id.EditText); List<Map<String,Object> ...