博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
7、OC —— set方法内存管理分析
阅读量:7105 次
发布时间:2019-06-28

本文共 1674 字,大约阅读时间需要 5 分钟。

  hot3.png

1、直接用个简单的例子来深入了解set方法的内存管理分析吧,前提是禁掉arc。

    a、有一个 Car 类,有一个 speed 的成员变量和一个公共的 run 方法;

    b、还有一个 Person 类,拥有 Car 类对象和一个 drive 的方法;

2、Car 和 Person 类代码实现:

    Car.h

#import 
@interface Car : NSObject@property int speed;- (void)run;@end

    Car.m

#import "Car.h"@implementation Car- (void)run{    NSLog(@"汽车正以%d的速度行驶", _speed);}- (void)dealloc{    NSLog(@"%d速度的汽车被销毁了", _speed);    [super dealloc];}@end

    Person.h

#import 
#import "Car.h"@interface Person : NSObject{    Car *_car;}- (void)setCar:(Car *)car;- (Car *)car;- (void)drive;@end

    Person.m

#import "Person.h"@implementation Person- (void)setCar:(Car *)car{    _car = car;}- (Car *)car{    return _car;}- (void)drive{    [_car run];}- (void)dealloc{    NSLog(@"人被销毁了");    [super dealloc];}@end

    main.m

#import 
#import "Person.h"#import "Car.h"int main(int argc, const char * argv[]){    @autoreleasepool {        Person *person = [[Person alloc] init];                Car *car = [[Car alloc] init];        car.speed = 100;                person.car = car;        [person drive];                [car release];        [person release];    }    return 0;}

3、以上方法虽然没有内存泄露,但存在很多问题:

    a、[car release] 方法一定要放在 [person release] 的前面,限制了car对象的使用,例如在 [car release] 后再次调用 [person drive] 便会报野指针错误;

    b、再创建一个 car2 对象,并调用 person 的set方法,之前的car对象便会有内存泄露问题;

    c、多次调用 person 的set方法存在内存泄露隐患问题;

4、于是我们将 Person 的set方法修改一下:

    Person.m

- (void)setCar:(Car *)car{    if (_car != car) {        [_car release];        _car = [car retain];    }}// 在person被回收之前release掉car对象- (void)dealloc{    [_car release];    NSLog(@"人被销毁了");    [super dealloc];}

5、这样在非arc机制下代码便更加符合内存管理,并不存在内存泄露等隐患。

转载于:https://my.oschina.net/cobish/blog/353927

你可能感兴趣的文章
浅析Java中的final关键字
查看>>
通过B表字段更新A表
查看>>
Matlab常用函数(1)
查看>>
19. Remove Nth Node From End of List C++删除链表的倒数第N个节点
查看>>
【原】centos系统命令部分不可用
查看>>
sqllocaldb
查看>>
因果图法设计测试用例
查看>>
BZOJ4807:車(组合数学,高精度)
查看>>
sas中的sql(8)sql选项解析,数据字典
查看>>
BZOJ4567:[SCOI2016]背单词——题解
查看>>
洛谷3676:小清新数据结构题——题解
查看>>
sed 指定行之间的内容替换
查看>>
MQTT协议简记
查看>>
[转] xgboost
查看>>
[转载]什么是“成功的项目”:谈谈软件交付价值
查看>>
easyui datagrid 动态表头配置
查看>>
web安全之SQL注入---第五章 如何预防SQL注入 ?
查看>>
KSFramework:Unity3D开发框架快速入门
查看>>
Daikon Forge GUI 制作UI面板
查看>>
转载:百度百科经典算法集合
查看>>