```objc
#import "Person.h"
#import "Car.h"
@interface Person ()
@property (nonatomic, strong) Car *car;
@end
@implementation Person
- (instancetype)initWithName:(NSString *)name {
self = [super init];
if (self) {
_name = name;
}
return self;
}
- (void)dealloc {
// 在这里释放相关的资源,dealloc就像是对象的“临终遗言”
NSLog(@"~");
[super dealloc];
}
@end
@interface Car ()
@property (nonatomic, strong) Person *person;
@end
@implementation Car
- (instancetype)initWithBrand:(NSString *)brand speed:(NSInteger)speed {
self = [super init];
if (self) {
_brand = brand;
_speed = speed;
person = [[Person alloc] initWithName:@"凤姐"];
[person retain]; // 使引用计数器+1,该方法返回对象本身
}
return self;
}
- (void)driveToLhasaWithPerson:(Person *)person {
_person = person; // 使引用计数器+1,该方法返回对象本身
}
- (void)leaveWithPerson:(Person *)person { // 使引用计数器-1(并不代表释放对象)
_person = nil; // 只是将指针置为nil,并不会自动减少引用计数器值(需要手动调用release)
}
- (NSInteger)retainCountForPerson:(Person *)person { // 获得对象当前的引用计数器值(调用retain时,计数器+1;调用release时,计数器-1)
return _person.retainCount;
}
- (void)releasePerson:(Person *)person { // 使引用计数器-1(并不代表释放对象),并触发dealloc方法(重写了dealloc方法就必须调用[super dealloc],并且放在代码块的最后调用)
_person.retainCount--; // 使引用计数器-1(并不代表释放对象)
_person.release(); // 使引用计数器-1(并不代表释放对象),并触发dealloc方法(重写了dealloc方法就必须调用[super dealloc],并且放在代码块的最后调用)
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
Car *car = [[Car alloc] initWithBrand:@"奥迪A4L" speed:200]; // 通过initWithBrand:speed:创建一个Car对象,并自动调用Person的initWithName:方法为其创建一个Person对象,同时使引用计数器+1,该方法返回对象本身。因为重写了dealloc方法,所以需要手动调用[super dealloc]并放在代码块的最后调用。在main函数中使用汽车和人时,都需要手动调用retain/release方法来增加或减少引用计数器的值。运行结果如下:
Person *p1 = car.person; // 通过属性访问方式获取到汽车里的Person对象,并使引用计数器+1,该方法返回对象本身。因为重写了dealloc方法,所以需要手动调用[super dealloc]并放在代码块的最后调用。运行结果如下:p1的retainCount = 1 p1的retainCount = 1 p1的retainCount = 2 p1的retainCount = 1 Person被销毁了 ~ 所以当一个对象的引用计数器为0时,那么它将被销毁,其占用的内存被系统回收。一旦重写了dealloc方法就必须调用[super dealloc],并且放在代码块的最后调用(不能直接调用dealloc方法)。实例分析:凤姐去拉萨多对象处理。