OC系列高级-内存管理二

一.MRC模式下set和get方法

首先我们创建一个Dog类

Dog.h:

#import <Foundation/Foundation.h>

@interface Dog : NSObject
@property (assign) int ID;
@end

Dog.m:

#import "Dog.h"

@implementation Dog
@synthesize ID = _ID;
- (void)dealloc{
    NSLog(@"Dog ID%d is death",_ID);
    [super dealloc];
}

@end

再创建一饿Person类

Person.h:

#import <Foundation/Foundation.h>
#import "Dog.h"
@interface Person : NSObject
{
    Dog *_dog;
}
-(void)setDog:(Dog *)newDog;
-(Dog *)dog;
@end

Person.m:

#import "Person.h"

@implementation Person

-(void)setDog:(Dog *)newDog{
    NSLog(@"%d",_dog.retainCount);
    if(_dog != newDog){
        [_dog release];
        _dog = nil;
        NSLog(@"%d",_dog.retainCount);
        _dog = [newDog retain];
        NSLog(@"%d",_dog.retainCount);
    }
}

-(Dog *)dog{
    return [_dog autorelease];
}

- (void)dealloc
{
    NSLog(@"Person is death");
    [super dealloc];
}

@end

在main函数中我们创建两个dog,并且创建person

        Dog *dog1 = [[Dog alloc]init];
        dog1.ID = 1;
        Dog *dog2 = [[Dog alloc]init];
        dog2.ID = 2;

        Person *p = [[Person alloc]init];

person set一个dog

   [p setDog:dog1];

此时,set方法完之后dog.retainCount值为2,因为dog创建和retain

当我们把dog1 release操作

        [dog1 release];
        NSLog(@"%d",dog1.retainCount);  //值为1
NSLog(@"%zd",p.retainCount);  //person的retainCount值为1,因为只是创建

我们把person release操作

        [p release];
        p = nil;

此时person retainCount值为0,并且调用了dealloc方法,但是person里的dog的retainCount值为1;所以我们在回收person时要把它的对象属性release操作,要不会引起内存空间的泄漏

当person没有执行release操作,再set一个dog1操作,此时,person的dog的retainCount值为1,即没有进行retain操作

注意点:

1.析构函数的release时一定要release掉包含的对象

时间: 2024-07-31 20:40:50

OC系列高级-内存管理二的相关文章

关于OC中得内存管理问题,alloc,retain,release,copy,dealloc

我们都知道,一个手机,它的内存是有限的,而每一个手机应用都是需要一定空间,当应用所占空间过大时,系统就会发出警告,怎样在有限的空间中,做到更高效实用美观的效果呢? 这时候就牵涉到OC中得内存管理了. 在OC这门语言中,是不存在垃圾回收机制的,但是它采用了另外一种形式或者说方法,实现这一个空间回收的效果,那就是引用计数器. 别看-引用计数器,这个名字很高大上,实际是它就是一个整数. 所以OC中分配4个字节才存储它. 引用计数的值只有两种:0和非0,我们知道,计算机其实是很笨的,结果只有这两种时,它

黑马程序员-oc对象的内存管理

oc没有java的垃圾回收机制,所以对象的内存释放很重要,基本数据类型,我们不用理会,编译器会处理: oc的每个对象内部都由一个计数器,用来记录当前有几个指针在指向该对象:当计数器为0时该对象会从内存中释放: 相关方法和概念: 1:retain:对象方法,调用该对象方法,计数器+1,有返回值,返回对象本身: 2:release:没有返回值,计数器-1: 3:retainCount:获取当前计数器的值: 4:dealloc:当对象被回收时,就会调用该方法,覆盖该方法时一定要调用[super dea

IOS阶段学习第20天笔记(OC中的内存管理)

IOS学习(OC语言)知识点整理 一.OC中的内存管理 1)概念:内存管理的对象为所有继承了NSObject的对象,对基本数据(如:int .float.double...)无效      OC中采用引用计数器对内存做管理,他是一个整数数据,表示对象引用的次数,每个对象分配4字节      的内存空间存放引用计数器.当一个对象的引用计数器为0时 它将被自动释放,反过来说 当使用alloc.      new .copy(mutableCopy)创建新对象时,引用计数器默认为1 2)黄金法则 当使

OC系列高级-内存管理关键字

一.MRC中@property关键字 1.assign,retain,copy 这几个关键字用语setter方法的内存管理 assign:一般用于非oc对象,直接自信赋值操作 retain:一般用于oc对象,那么将retain新值,release旧值 copy:将release旧值,copy新值 一般默认是assign 2.nonatomic和atomic 这两个关键字用语多线程管理,nontomic性能高,atomic性能低,不显示使用以atomic为默认值 3.readwrite和reado

OC系列高级-内存管理

一.MRC 和 ARC 1.mrc模式下声明一个Dog对象 析构函数 二.mrc手动内存管理模式下get和set方法

OC内存管理(二)

一:autorelease 1> autorelease原理:将我们创建的对象放到一个对象释放池中(是一个栈区)当池子释放时,会将池子中的对象都做一次release操作(自动释放池存放在一个池子中,就近原则,符合先进后出) 2>自动释放池的创建方式 (1)ios 5.0以前的创建方式 NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init]; ````````````````` [pool  release];//[pool drain]

OC 高级内存管理

// // main.m // 第8讲 // / #import <Foundation/Foundation.h> #import "teacher.h" #import "classes.h" #import "man.h" #import "woman.h" #import "Student.h" #import "Card.h" /* 类簇: 多个类的组合,多个类来实

黑马程序员--Objective-C之--OC中的内存管理

对于面向对象的变成语言,程序需要不断地创建对象. 初始,创建的所有程序通常都有指针指向它,程序可能需要访问这些对象的实例变量或调用这些对象的方法,随着程序的不断执行,程序再次创建了一些新的对象, 而那些老的对象已经不会再被调用,也不再有指针指向他们,如果程序没有回收他们占用的内存,就会出现内存泄露. 如果程序一直泄露内存,那么可用内存就会越来越少,直到没有足够的内存,程序將会崩溃.目前,主要有两种管理内存的技术,一是引用计数,二是垃圾回收. iOS平台目前只支持引用计数,Mac平台支持垃圾回收.

OC - 浅谈内存管理

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

OC中的内存管理01

一.内存管理要遵循的原则 1> 谁创建,谁release (看到 alloc.copy.new就应该有写release的冲动). 2> 谁retain,谁release (简单的来说就是要负责嘛,不能retain后不管了). 3> 说明下苹果在这方面做的很严谨,后面的学习会接触到ARC,Xcode会帮我们自动管理相应的内存. 二.基本原理 1> 每个对象的内部都封装的一个与之相关的整数,称之为引用计数器. 2> 当使用alloc.new或者copy创建对象时,计数器被设置为1