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];
}

那怎么办呢?

上一篇:ie11 selenium 报错org.openqa.selenium.NoSuchWindowException: Unable to get browser 处理方法


下一篇:深入理解Java虚拟机(二)——HotSpot对象创建、内存、访问