前言
例如,有一个Car类:
#import <Foundation/Foundation.h>
@interface Car : NSObject
@property(nonatomic,assign)int speed;
- (void)run;
@end
#import “Car.h”
@implementation Car
– (void)dealloc
{
NSLog(@“车废了。。。”);
}
– (void)run
{
NSLog(@“时速为%d的车,在行驶。。。”,_speed);
}
@end
还有一个Person类:
#import <Foundation/Foundation.h>
#import “Car.h”
@interface Person : NSObject
@property(nonatomic,retain)Car *car;
@end
#import “Person.h”
@implementation Person
@end
一、第一个问题,能用retain吗
1)@property(nonatomic,retain)Car *car;
这句话,能用retain吗?
2)retain参数,能不能在ARC机制下面去使用呢。。。不能,
为什么:
@property(nonatomic,retain)Car car;
/
– (void)setCar:(Car *)car
{
if(_car != car)
{
[_car release];
_car = [car retain];
}
}
*/
3)在ARC的机制下,@property的参数不能使用retain。
因为retain代表生成的setter方法是MRC的标准的内存管理代码。
而我们在ARC的机制下,不需要这些代码
二、ARC机制下的对象的回收的标准,当没有任何强类型的指针指向对象的时候,这个对象就会被立即回收
1.强类型指针 ,弱类型指针
2.什么情况下,叫做对象没有强类型指针指向
1)指向对象的强指针被回收
2)指向对象的强指针被赋值为nil
三、在ARC机制下,@property参数不能使用retain,因为retain代表生成的setter方法是MRC的标准的内存管理代码,而我们在ARC的机制下,不需要这些代码
1)所以,在ARC机制下的setter方法,什么都不需要做,直接赋值就可以了
2)@interface Person:NSObject
{
Car *_car;
}
Person的这个Car指针,是应该为强指针,还是应该为弱指针
很明显,应该为强指针,因为如果为弱指针,人还在呢,车可能就没了
所以,这个Car指针,应该是一个强指针,保证只要Person在,Car指针指向的对象就不会被回收
3)ARC机制下,我们关注的重点
当1个类的属性是OC对象的时候,这个属性应该声明为强类型的还是弱类型的。
很明显,应该声明为一个强类型的。
例如:
@interface Person:NSObject
{
__weak Car *_car;
}
– (void)setCar:(Car *)car;
– (Car *)car;
@end
在Person .m文件中:
#import “Person.h”
@implementation Person
– (void)setCar:(Car *)car
{
_car = car;
}
– (Car *)Car
{
return _car;
}
在main.m文件中:
#import <Foundation/Foundation.h>
#import “Person.h”
int main()
{
Person *p1 = [Person new];
Car *c1 = [Car new];
p1.car = c1 ;
c1 = nil;
}
输出:车挂了。。。
人挂了
这时候,这个Car有几个指针指向它,两个:
a c1这个强指针
b _car属性这个弱指针,
此时,c1被设置成nil,没有强指针指向这辆车了,车挂了。。。但是,人还在,这样就很尴尬了。。。
如果_car属性是个强指针,就算c1等于nil,这个Car对象会不会回收,不会,因为还有一个强指针指向它呢。。。
例如,把Person.h文件改成这样:
#import <Foundation/Foundation.h>
#import “Car.h”
@interface Person : NSObject
{
__strong Car *_car;
}
– (void)setCar:(Car *)car;
– (Car *)car;
@end
这时候,再运行main.m文件,输出如下:
输出:人挂了。。。
车挂了。。。
说明,人挂了之后,车才会挂,所以会不会出现人还在,车挂了的情况啊,不会
四、用@property怎么实现上面的代码
1)@property(nonatomic)Car *car;
我们知道@property是不是生成1个属性啊,它生成的这个属性,是强类型的,还是弱类型的,如何控制@property生成的私有属性,是1个强类型的,还是1个弱类型的呢
2)@property的两个参数strong与weak
@property(nonatomic,strong)Car *car;
代表生成的私有属性_car,是1个强类型的
@property(nonatomic,weak)Car *car;
代表生成的私有属性_car,是1个弱类型的
3)如果不写,默认为strong。