```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方法)。实例分析:凤姐去拉萨多对象处理。