iOS 非ARC基本内存管理系列 2-多对象内存管理(3) 利用@property来自动管理内存

iOS 基本内存管理-多对象内存管理(2)中可以看到涉及到对象的引用都要手动管理内存:每个对象都需要写如下代码

// 1.对要传入的"新车"对象car和目前Person类对象所拥有的"旧车"_car进行判读
- (void)setCar:(Car *)car
{
   if (_car != car ) {
        [_car release]; // 释放旧车
        _car = [car retain]; // 新车引用计数加一
    }
}

// 2.Person类在回收的时候也必须将它所拥有的车对象回收
- (void)dealloc
{
    // Person对象被回收 那么将Person类对象拥有的Car对象_car对象也应该被回收
    [_car release];
    [super dealloc];
}

如果有很多个类要被引用那要写很多类似的代码,那么可以用@Property来自动生成上面的代码,但是必须借助@Property的参数,可分为四种类型:

1.set方法内存管理相关的参数

retain:用于任何OC对象类型,可以自动生成set方法中管理内存的代码,作用和上面示例中的set方法中的代码作用一致

assign:用于任何非OC对象,比如:枚举、结构和基本数据类型,可以自动生成set方法不涉及管理内存操作

copy:release旧值,copy新值一般用于NSString

2.是否要生成set方法参数

readwrite:同时生成get、set方法的声明、实现(默认)

readonly:只会生成get方法的声明和实现

3.多线程管理参数

nonatomic:性能比较高(一般用它)

atomic:性能低(默认)

4.是否为sett和get方法重命名

@property (getter = getAge,setter = setAge:) int age;  // 在定义属性的时候可以自定义get/set方法的名 set方法一定要加冒号

// 这个参数主要用于BOOL类型在调用get方法的时候 方法名最好以is开头 @property (getter
= isRich) BOOL rich; // 返回是否富有 那么get方法最好以is开头 BOOL b = person.isRich;

5.总结:在内存管理中常用的写法如下

@property (nonatomic,retain) NSString *name;
@property (nonatomic,retain) Book *book;
@property (nonatomic,assign) int age;

它的作用如下面代码:

// 1.对要传入的"新车"对象car和目前Person类对象所拥有的"旧车"_car进行判读
- (void)setCar:(Car *)car
{
   if (_car != car ) {
        [_car release]; // 释放旧车
        _car = [car retain]; // 新车引用计数加一
    }
}

可以看出:@propery已经实现了,OC对象在set方法中一部分的内存管理,但是还是没有完全回收对象如下代码的作用就没有体现

// 2.Person类在回收的时候也必须将它所拥有的车对象回收
- (void)dealloc
{
    // Person对象被回收 那么将Person类对象拥有的Car对象_car对象也应该被回收
    [_car release];
    [super dealloc];
}

那怎么办呢?

原文地址:https://www.cnblogs.com/QM80/p/3594113.html