1. 內存管理補充:
1.1. setter方法:
@autoreleasepool {
#pragma 驗證Person類dealloc方法裏的:[_car release]
{
Person *p = [[Person alloc] init];
Car *c = [[Car alloc] init];
[c setSpeed:100];
[p setCar:c];
[p go];
[c release];
[p go];
[p go];
[p release];
}
#pragma 驗證Person類setCar方法裏的:[_car release]
{
Person *p = [[Person alloc] init];
Car *bmw = [[Car alloc] init];
[bmw setSpeed:100];
[p setCar:bmw];
[p go];
[bmw release];
Car *byd = [Car new];
[byd setSpeed:80];
[p setCar:byd];
[p go];
[byd release];
[p release];
}
#pragma 驗證Person類setCar方法裏的:if (_car != car)
{
Person *liubo = [Person new];
Car *bicycle = [Car new];// 1
bicycle.speed = 80;
[liubo setCar:bicycle];// 2
[bicycle release];// 1
[liubo setCar:bicycle]; // 訪問殭屍對象肯定會崩,你又不能起死回生。。所以要寫if那句話
[liubo go];
[liubo release];
}
// 類用assign可能會造成野指針和內存泄露的問題 所以要使用retain
}
Person類:
#import <Foundation/Foundation.h>
@class Car;
@interface Person : NSObject
{
Car *_car;
}
//@property (nonatomic,retain) Car *car;
- (void)setCar:(Car *)car;
- (void)go;
@end
#import "Person.h"
#import "Car.h"
@implementation Person
- (void)setCar:(Car *)car{
if (_car != car) {
[_car release];
_car = [car retain];
}
}
- (void)go{
[_car run];
}
- (void)dealloc{
[_car release];
NSLog(@"people is over");
[super dealloc];
}
@end
Car類:
#import <Foundation/Foundation.h>
@interface Car : NSObject
{
int _speed;
}
- (void)setSpeed:(int)speed;
- (void)run;
@end
#import "Car.h"
@implementation Car
- (void)setSpeed:(int)speed{
_speed = speed;
}
- (void)run{
NSLog(@"The car is running 速度:%d.", _speed);
}
- (void)dealloc{
NSLog(@"%d car is over",_speed);
[super dealloc];
}
@end
在setter 方法中不寫_car retain會造成野指針。。。。1.2. 多態:
Animal *d = [Dog new];
// 多態:沒有繼承就不能實現多態機制,父類指針可以指向不同的子類對象
1.3. collection:
Person *p = [[Person alloc] init];
// 如果數組創建是用[[NSMutableArray alloc] init],則需要在用完後:對數組進行release
NSMutableArray *array = [NSMutableArray array];
// 把對象放到數組中的時候,對象的引用計數會+1
[array addObject:p];
NSLog(@"%lu", p.retainCount); // 結果是:2
// 從數組中移除的時候,引用計數-1
[array removeObject:p];
NSLog(@"%lu", p.retainCount); // 結果是:1
[p release];
集合的內存管理:集合會管理自己的元素
添加對象時,會對這個對象retain一次
移除對象時,會對這個對象release一次
對象銷燬時,集合會對集合中包含的所有對象發送一條release消息
add/insert :計數器+1
remove/delete :計數器-1