Objective-C - 多个对象之间的内存管理

多个对象之间的内存管理


/*
 1.你想使用(占用)某个对象,就应该让对象的计数器+1(让对象做一次retain操作)
 2.你不想再使用(占用)某个对象,就应该让对象的计数器-1(让对象做一次release)

 3.谁retain,谁release

 4.谁alloc,谁release
 */

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Book.h"

int main()
{
    // b-1
    Book *b = [[Book alloc] init];
    // p-1
    Person *p1 = [[Person alloc] init];

    //p1想占用b这本书
    // b-2
    [p1 setBook:b];

    // p-0
    // b-1
    [p1 release];
    p1 = nil;

    // b-0
    [b release];
    b = nil;
    return 0;
}
@interface Book : NSObject
{
    int _price;
}

- (void)setPrice:(int)price;
- (int)price;

@end

#import "Book.h"

@implementation Book

- (void)setPrice:(int)price
{
    _price = price;
}

- (int)price
{
    return _price;
}
- (void)dealloc
{
    NSLog(@"Book对象被回收");
    [super dealloc];
}
@end
#import "Book.h"

@interface Person : NSObject
{
    Book *_book;
}

- (void)setBook:(Book *)book;
- (Book *)book;

@end
#import "Person.h"

@implementation Person
- (void)setBook:(Book *)book
{
    _book = [book retain];
}

- (Book *)book
{
    return _book;
}

- (void)dealloc
{
    [_book release];
    NSLog(@"Person对象被回收");
    [super dealloc];
}
@end

set方法的内存管理



 //内存管理代码规范:
 //1.只要调用了alloc,必须有release(autorelease)
  // 对象不是通过alloc产生的,就不需要release

 //2.set方法的代码规范
// 1> 基本数据类型:直接复制
 - (void)setAge:(int)age
 {
    _age = age;
 }

 2> OC对象类型
 - (void)setCar:(Car *)car
 {
    // 1.先判断是不是新传进来对象
    if ( car != _car )
    {
        // 2.对旧对象做一次release
        [_car release];

        // 3.对新对象做一次retain
        _car = [car retain];
    }
 }

 //3.dealloc方法的代码规范
 //1> 一定要[super dealloc],而且放到最后面
 //2> 对self(当前)所拥有的其他对象做一次release
 - (void)dealloc
 {
    [_car release];
    [super dealloc];
 }
 */

// 速度为100的车子:
// 速度为200的车子:p1->_car

int main()
{
    // stu - 1
    Student *stu = [[Student alloc] init];

    // Car - 2
    // 这行内存有内存泄露
    //stu.car = [[Car alloc] init];

    // stu - 0
    // Car - 1
    [stu release];

    // 这行内存有内存泄露
    // [[Car alloc] init].speed = 100;

    return 0;
}

void test3()
{
    Student *stu = [[Student alloc] init];

    Car *c = [[Car alloc] init];
    stu.car = c;

    Dog *d = [[Dog alloc] init];

    stu.dog = d;

    NSString *s = @"Jack";

    stu.name = s;

    [d release];
    [c release];
    [stu release];
}

void test2()
{
    Person *p1 = [[Person alloc] init];
    p1.age = 20;

    // c1 - 1
    Car *c1 = [[Car alloc] init];
    c1.speed = 100;
    // c1 - 2
    p1.car = c1;
    // c1 - 1
    [c1 release];

    Car *c2 = [[Car alloc] init];
    c2.speed = 200;
    // c1 - 0
    p1.car = c2;

    [c2 release];

    [p1 release];
}

void test1()
{
    // p-1
    Person *p = [[Person alloc] init];
    p.age = 20;

    // c1-1
    Car *c1 = [[Car alloc] init];
    c1.speed = 250;

    // c1-2
    p.car = c1;

    // c1-1
    [c1 release];

    p.car = c1;
    p.car = c1;
    p.car = c1;
    p.car = c1;
    p.car = c1;
    p.car = c1;
    p.car = c1;

    [p release];
}

void test()
{
    // p-1
    Person *p = [[Person alloc] init];
    p.age = 20;

    // c1-1
    Car *c1 = [[Car alloc] init];
    c1.speed = 250;

    // p想拥有c1
    // c1-2
    p.car = c1;  // [p setCar:c1];

    // c2-1
    Car *c2 = [[Car alloc] init];
    c2.speed = 300;

    // p将车换成了c2
    // c1-1
    // c2-2
    p.car = c2;

    // c2-1
    [c2 release];
    // c1-0
    [c1 release];
    // p-0 c2-0
    [p release];
}
#import "Car.h"

@interface Person : NSObject
{
    Car *_car;
    int _age;
}

- (void)setAge:(int)age;
- (int)age;

- (void)setCar:(Car *)car;
- (Car *)car;

@end
@implementation Person
- (void)setCar:(Car *)car
{
    if (car != _car)
    {
        // 对当前正在使用的车(旧车)做一次release
        [_car release];

        // 对新车做一次retain操作
        _car = [car retain];
    }
}
- (Car *)car
{
    return _car;
}

- (void)setAge:(int)age
{ // 基本数据类型不需要管理内存
    _age = age;
}
- (int)age
{
    return _age;
}

- (void)dealloc
{
    // 当人不在了,代表不用车了
    // 对车做一次release操作
    [_car release];

    NSLog(@"%d岁的Person对象被回收了", _age);

    [super dealloc];
}

@end
@interface Car : NSObject
{
    int _speed;
}

- (void)setSpeed:(int)speed;
- (int)speed;
@end
@implementation Car
- (void)setSpeed:(int)speed
{
    _speed = speed;
}
- (int)speed
{
    return _speed;
}

- (void)dealloc
{
    /*
     _speed :直接访问成员变量
     self->_speed :直接访问成员变量
     self.speed : get方法
     [self speed] : get方法
     */

    NSLog(@"速度为%d的Car对象被回收了", _speed);

    [super dealloc];
}

@end
#import "Car.h"
#import "Dog.h"

@interface Student : NSObject
{
    int _no;
    NSString *_name;
    Car *_car;
    Dog *_dog;
}

- (void)setNo:(int)no;
- (int)no;

- (void)setName:(NSString *)name;
- (NSString *)name;

- (void)setCar:(Car *)car;
- (Car *)car;

- (void)setDog:(Dog *)dog;
- (Dog *)dog;

@end

@implementation Student
- (void)setNo:(int)no
{
    _no = no;
}
- (int)no
{
    return _no;
}

- (void)setName:(NSString *)name
{
    if ( name != _name )
    {
        [_name release];
        _name = [name retain];
    }
}

- (NSString *)name
{
    return _name;
}

- (void)setCar:(Car *)car
{
    if ( car != _car )
    {
        [_car release];
        _car = [car retain];
    }
}
- (Car *)car
{
    return _car;
}

- (void)setDog:(Dog *)dog
{
    if ( dog != _dog )
    {
        [_dog release];
        _dog = [dog retain];
    }
}
- (Dog *)dog
{
    return _dog;
}

- (void)dealloc
{
    [_name release];
    [_car release];
    [_dog release];

    [super dealloc];
}
@end
@interface Dog : NSObject

@end

@implementation Dog

@end
时间: 2024-11-07 03:04:29

Objective-C - 多个对象之间的内存管理的相关文章

Objective-C:Objective-C 和 Core Foundation 对象相互转换的内存管理

Objective-C 和 Core Foundation 对象相互转换的内存管理 iOS允许Objective-C 和 Core Foundation 对象之间可以轻松的转换,拿 NSString 和 CFStringRef 来说,直接转换豪无压力: CFStringRef aCFString = (CFStringRef)aNSString; NSString *aNSString = (NSString *)aCFString; 针对内存管理问题,ARC 可以帮忙管理 Objective-

zzz Objective-C 和 Core Foundation 对象相互转换的内存管理总结

Objective-C 和 Core Foundation 对象相互转换的内存管理总结   iOS允许Objective-C 和 Core Foundation 对象之间可以轻松的转换,拿 NSString 和 CFStringRef 来说,直接转换豪无压力: CFStringRef aCFString = (CFStringRef)aNSString; NSString *aNSString = (NSString *)aCFString; 针对内存管理问题,ARC 可以帮忙管理 Object

OC第三天(内存管理)

内存管理: 1.作用范围: 任何继承了NSObject的对象,堆基本数据类型无效如:int a ,float price;;等 2.原理: 每个对象内部都保存了一个与之相关的整数,称为引用计数器, 当使用alloc   new   copy创建一个对象的时候,对象的引用计数器被设置为1 每给对象发送一次retain消息,可以使引用计数器+1: 给对象发送一条release消息,可以使引用计数器-1: 当一个对象的引用计数器为0时,那么它将被销毁,其占用的内存被系统回收,OC也会自动向对象发送一条

关于内存管理

最近都是ARC写代码,弄了一下午整理了一下MRC的使用,原创哦!~!~~ 1 任何继承NSObject的对象,都需要管理内存2 基本数据类型放到栈中,对象放到堆空间中3 oc对象 nil指针 release 不报错4 僵尸对象检测 stop右->Edit Scheme->Diagncatics-> Objective-C->勾选Enable zomble objects ---------单个对象的内存管理--------- 每个对象给引用计数器分配四个字节的存储空间,当对象的引用

内存管理2-set方法的内存管理

1.对象之间的内存管理: 每个学生都有一本书 book类 学生类 #import "book.h" @interface Student:NSObject @property int age @property BOOK *book;//OC类名 @end

黑马程序员——OC学习小结------OC内存管理

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.计数器 1.方法的基本使用 1> retain :计数器+1,会返回对象本身 2> release :计数器-1,没有返回值 3> retainCount :获取当前的计数器 4> dealloc: * 当一个对象要被回收的时候,就会调用 * 一定要调用[super dealloc],这句调用要放在最后面 2.概念 1> 僵尸对象 :所占用内存已经被回收的对象,僵尸对象

iOS核心语言Objective C语言 —— 内存管理

本分享是面向有意向从事iOS开发的伙伴以及苹果产品的发烧友们,或者已经从事了iOS的开发者,想进一步提升者.如果您对iOS开发有极高的兴趣,可以与我一起探讨iOS开发,一起学习,共同进步.如果您是零基础,建议您先翻阅我之前分享的iOS开发分分钟搞定C语言系列,然后在开始Objective C语言的学习,如果您遇到问题也可以与我探讨,另外将无偿分享自己整理出来的大概400G iOS学习视频及学习资料,都是干货哦!可以新浪微博私信?关注极客James,期待与您的共同学习和探讨!!由于时间有限,每天在

Obstack是C标准库里面对内存管理的GNU扩展

Obstack介绍 Obstack初始化 在Obstack中申请对象 释放对象 申请growing object 获取Obstack状态 数据对齐 以下是来自wiki对obstack的介绍: Obstack是C标准库里面对内存管理的GNU扩展(实际上就是GNU C library了).Obstack===Object stack.没错,Obstack就是一个栈,栈里面的元素是对象object(不是面向对象的对象哦,这里的对象单指数据元素).这些数据是动态的,也就是使用的是动态内存.这种内存管理技

(转)从内存管 理、内存泄漏、内存回收探讨C++内存管理

http://www.cr173.com/html/18898_all.html 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对 C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,因此要想成为C++高手,内存管理一关是必须要过的,除非放弃 C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支配权,还放弃了C++超绝的性能