内存管理和@property的属性

目录

  • 对内存管理的理解
  • 内存的管理

对象的所有权和内存管理原则

合理解决内存管理带来的问题

自动释放池

  • @property的属性

对内存管理的理解

内存的管理

对象的所有权和内存管理原则

一个对象和一个函数都可以拥有对类对象的管理权,因此对象和函数需要负责类对象的创建和释放

合理解决内存管理带来的问题(在MRC下,在dealloc上有对拥有对象做释放)

阶段一

MyClass *myClass = [[MyClass alloc] init];

//myClass的行为

[myClass release];

阶段二

-(void)setEngine:(Engine *)newEngine{ engine = newEngine; }

Car *car = [[Car alloc] init];

Engine *engine = [[Engine alloc] init];  //1

[car setEngine:engine];  //1

[engine release];   //0 致使car对象中的engine指向的对象为空

阶段三

对setter的调整:-(void)setEngine:(Engine *)newEngine{ engine = [newEngine retain]; };

存在问题:

Engine *engine1 = [Engine new];  //1

[car setEngine:engine1];  //2

[engine1 release];  //1

Engine *engine2 = [Engine new];  //1

[car setEngine:engine2];  //1

[car release];  //1 此时engine1没有被释放掉,即car原来指向的对象没有被释放

阶段三

继续对setter的调整:-(void)setEngine:(Engine *)newEngine{  [engine release]; engine = [newEngine retain];  }

存在问题

Engine *engine = [Engine new];  //1

Car *car1 = [Car new];

Car *car2 = [Car new];

[car1 setEngine: engine];  //2

[engine release];  //1

[car2 setEngine:[car1 engine]];  //出错  此时engine的引用计数为0,car1和car2都不能使用其engine属性

阶段四

继续对setter的调整:-(void)setEngine:(Engine *)newEngine{  [newEngine retain]; [engine release]; engine = newEngine;  }

自动释放池

@property的属性

时间: 2024-10-06 18:13:35

内存管理和@property的属性的相关文章

OC语法7——内存管理之@property参数

@property的参数: 我们已经知道为了给开发者提供便捷,OC提供了@porperty关键字,它可以自动生成属性的set和get方法. 但是我们又知道,在OC中还面临者对象内存管理的问题,而且我们遵循“谁创建,谁释放”的原则管理内存. 所以我们得重写set方法:把原先的成员变量(对象)release掉,然后给新成员变量retain. 还得重写realloc方法:在realloc中调用release,释放该对象. 呵呵.我们引入@property的目的就是为了让其自动生成set和get方法的,

iOS学习笔记之内存管理及@property

iOS5之后苹果公司引入了ARC机制,大大方便了ios开发者对内存的管理机制.在iphone 4出世的时候为什么ios在512M的内存中可以运行很大的游戏,保持畅快流畅的状态.得益于ios非常好的内存处理机制. 在我们现在创建项目的时候,默认会直接引入ARC机制,我们可以关闭ARC机制:在输入框中输入long点击搜索按钮,如图: 接下来即可进行老版本的内存操作了. 在老版本中,内存操作采用了引用计数(retainCount)alloc retain(+1)release(-1) 内存管理原则(配

oc-set方法内存管理 和 @property的参数

想一个对象中 连续两次set某个对象,会造成先set的对象 没有release,造成内存没有释放. 1 /* 2 内存管理代码规范: 3 1.只要调用了alloc,必须有release(autorelease) 4 对象不是通过alloc产生的,就不需要release 5 6 2.set方法的代码规范 7 1> 基本数据类型:直接复制 8 - (void)setAge:(int)age 9 { 10 _age = age; 11 } 12 13 2> OC对象类型 14 - (void)set

iOS内存管理机制

概述 我们知道在程序运行过程中要创建大量的对象,和其他高级语言类似,在ObjC中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是由系统自己管理的,放在栈上).如果一个对象创建并使用后没有得到及时释放那么就会占用大量内存.其他高级语言如C#.Java都是通过垃圾回收来(GC)解决这个问题的,但在OjbC中并没有类似的垃圾回收机制,因此它的内存管理就需要由开发人员手动维护.今天将着重介绍ObjC内存管理: 引用计数器 属性参数 自动释放池 引用计数器 在Xcode4.2及之后的版本中

iOS-旧项目中手动内存管理(MRC)转ARC

在ARC之前,iOS内存管理无论对资深级还是菜鸟级开发者来说都是一件很头疼的事.我参 加过几个使用手动内存管理的项目,印象最深刻的是一个地图类应用,由于应用本身就非常耗内存,当时为了解决内存泄露问题,每周都安排有人值班用 Instruments挨个跑功能,关键是每次都总能检查出来不少.其实不管是菜鸟级还是资深级开发者都避免不了写出内存泄露的代码,规则大家都懂,可是 天知道什么时候手一抖就少写了个release? 好在项目决定转成ARC了,下面将自己转换的过程和中间遇到的问题写出来和大家共享,希望

内存管理高级

内存管理高级 内存管理高级: 1.属性的内部实现原理 2.dealloc内释放实例变量 3.便利构造器方法的实现原理 4.collection的内存管理 name, age, gender 自定义初始化方法 便利构造器 Student.h #import <Foundation/Foundation.h> @interface Student : NSObject <NSCopying> //重在对象, 使用retain; 重在内容, 使用copy @property (nonat

IOS开发系列—Objective-C之内存管理

概述 我们知道在程序运行过程中要创建大量的对象,和其他高级语言类似,在ObjC中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是由系统自己管理的,放在栈上).如果一个对象创建并使用后没有得到及时释放那么就会占用大量内存.其他高级语言如C#.Java都是通过垃圾回收来(GC)解决这个问题的,但在OjbC中并没有类似的垃圾回收机制,因此它的内存管理就需要由开发人员手动维护.今天将着重介绍ObjC内存管理: 引用计数器 属性参数 自动释放池 引用计数器 在Xcode4.2及之后的版本中

Objective-C(7)内存管理之MRC

Objective-C内存管理 管理范畴:OC对象 每个计算机系统可供程序使用的内存资源是有限的.我们要关心两件事情: 在需要时分配,用完之后释放 不要使用任何已被释放的内存资源,否则将无用陈旧的值导致各种各样的错误发生 三种管理方式: 手动管理方式 MRC(Manual referencing count) 半自动管理方式  autoreleasepool 自动管理方式 ARC(Auto referencing count) 引用计数与内存管理准则 Cocoa采用了一种称为"引用计数"

Objective-C(9)内存管理之ARC

ARC机制及判断准则 ARC:Auto Reference Counting 自动引用计数 是一种编译器机制,在编译过程中,为我们的代码添加retain.release.autorelease等方法 在iOS7.0之后强制使用,使程序员不用再关心内存管理,要求: 1)不能使用retain release等操作引用计数的方法 2)不可以使用autorelease方法,但能够使用自动释放池 3)重写dealloc方法中不能再使用[super dealloc] 判断准则: 只要没有强指针指向对象,就会