OC set方法的内存管理

来源:互联网 发布:网络枪战手游 编辑:程序博客网 时间:2024/05/18 01:33


当一个对象中引用了另外一个对象, 在set方法中应当注意所引用的对象和原来所拥有的对象是否为同一对象. 以避免发生野指针错误


示例代码如下

////  Car.h//  set方法内存管理////  Created by LiuWei on 15/4/16.//  Copyright (c) 2015年 LiuWei. All rights reserved.//#import <Foundation/Foundation.h>@interface Car : NSObject{    int _speed;}- (void)setSpeed: (int)speed;- (int)speed;@end

////  Car.m//  set方法内存管理////  Created by LiuWei on 15/4/16.//  Copyright (c) 2015年 LiuWei. All rights reserved.//#import "Car.h"@implementation Car- (void)setSpeed:(int)speed{        _speed = speed;}- (int)speed{    return _speed;}- (void)dealloc{    NSLog(@"速度为%i的车子被释放", _speed);    [super dealloc];}@end


////  Person.h//  set方法内存管理////  Created by LiuWei on 15/4/16.//  Copyright (c) 2015年 LiuWei. All rights reserved.//#import <Foundation/Foundation.h>#import "Car.h"@interface Person : NSObject{    int _age;    Car *_car;}- (void)setAge: (int)age;- (int)age;- (void)setCar: (Car*)car;- (Car *)car;@end


////  Person.m//  set方法内存管理////  Created by LiuWei on 15/4/16.//  Copyright (c) 2015年 LiuWei. All rights reserved.//#import "Person.h"@implementation Person- (void)setAge:(int)age{    _age = age;}- (int)age{    return _age;}- (void)setCar:(Car *)car{    if(_car != car) // 判断传入的Car对象和原来所拥有的Car对象是否一样 一样则不需要进行任何处理    {        [_car release]; // 和原来的Car对象不一样,则使原来引用的Car对象引用计数减1        _car = [car retain]; // 引用新的Car对象并使引用计数加1    }}- (Car *)car{    return _car;}- (void)dealloc{    NSLog(@"年龄为 %i的Person对象被释放了!", _age);        [_car release]; // 在对象释放时释放所引用的资源        [super dealloc];}@end


////  main.m//  set方法内存管理////  Created by LiuWei on 15/4/16.//  Copyright (c) 2015年 LiuWei. All rights reserved.//#import <Foundation/Foundation.h>#import "Person.h"#import "Car.h"int main() {       Car *biyadi = [[Car alloc]init];    biyadi.speed = 120;        Car *BMW = [[Car alloc]init];    BMW.speed = 180;        Person *xiaoMing = [[Person alloc]init];    xiaoMing.age = 35;    xiaoMing.car = biyadi;    NSLog(@"biyadi 引用计数: %lu", [biyadi retainCount]);        xiaoMing.car = BMW;    NSLog(@"biyadi 引用计数: %lu", [biyadi retainCount]);    NSLog(@"BMW 引用计数: %lu", [BMW retainCount]);        xiaoMing.car = BMW;    NSLog(@"BMW 引用计数: %lu", [BMW retainCount]);            [xiaoMing release];    [BMW release];    [biyadi release];    return 0;}

运行结果如图



0 0
原创粉丝点击