主要内容:内存管理高级(昨天的延伸)
一、属性内部的实现原理
1、assign
setter方法
- (void)setAge:(NSInteger)age
{
_age = age;
}
getter方法
- (NSInteger)age
{
return _age;
}
2、copy
@synthesize name = _name;
setter方法
@property (nonatomic , copy) NSString *name;
- (void)setName:(NSString *)name
{
if (_name != name) {
[ name release ] ;
_name = [ name copy ] ;
}
}
getter方法
- (NSString *)name
{
return [ [ _name retain ] autorelease ] ;
}
3、retain
@synthesize name = _name;
setter 方法
@property (nonatomic , retain ) NSString *name;
- (void) setName:(NSString *)name
{
if (_name != name) {
[ name release ] ;
_name = [ name retain ] ;
}
}
- (NSString *)name
{
return [ [ _name retain ] autorelease ] ;
}
二、dealloc方法
- (void)dealloc
{
[ _name release ] ;
[super dealloc] ;
}
作用:在对象引用计数为0时,系统自动调用(通常我们在dealloc中释放类的实例变量)
dealloc是NSObject的一个实例方法,与alloc对应,用于回收开辟的内存空间
注意:
1、永远不要手动调用dealloc
2、在dealloc的最后一行,必须要写 [ super dealloc ] ;
三、便利构造器的内存管理
+(instancetype)personWithName:(NSString *)name
age:(NSInteger)age;
{
return [ [ [ Person alloc ] initWithName:name age:age ] autorelease ] ;
}
四、collection的内存管理(集合会管理自己的元素)
collection就是NSArray、NSDictionary。。等容器类
collection会自动管理自己内部的元素
注意:
1、加入collection中的对象会被retain
2、移除出collection的对象会release
3、collection被释放会对内部所有元素release
示例:
Person.h文件
@interface Person : NSObject
#pragma mark - 声明属性
@property (nonatomic , sopy) NSString *name ;
@property (nonatomic , retain) NSString *gender;
@property (nonatomic , assign) NSInteger age;
#pragma mark - 声明方法
#pragma mark 初始化方法
- (instancetype)initWithName:(NSString *)name
gender:(NSString)gender
age:(NSInteger)age ;
#pragma mark 便利构造器
+ (instancetype)personWithName:(NSString)name
gender:(NSString *)gender
age:(NSInteger)age ;
@end
Person.m文件
@implementation Person
#pragma mark - 重写setter和getter方法
#pragma mark name
- (void)setName:(NSString *)name
{
if (_name != name) {
[ name release ] ;
_name = [ name copy ] ;
}
}
- (NSString *)name
{
return [ [ _name retain ] autorelease ] ;
}
#pragma mark gender
- (void)setGender
{
if (_gender != gender) {
[ gender release ] ;
_gender = [ gender retain ] ;
}
}
- (NSString *)gender
{
return [ [ _gender retain ] autorelease ] ;
}
#pragma mark - 实现方法
#pragma mark 初始化方法
- (instancetype)initWithName:(NSString *)name
gender:(NSString)gender
age:(NSInteger)age
{
if (self = [ super init ] ) {
self.name = name;
self.gender = gender;
self.age = age;
}
return self ;
}
#pragma mark 便利构造器
+ (instancetype)personWithName:(NSString)name
gender:(NSString *)gender
age:(NSInteger)age
{
return [ [ [ Person alloc ] initWithName:name gender:gender age:age ] autorelease ] ;
}
#pragma mark - 重写dealloc方法
- (void)dealloc
{
[ _name release ] ;
[ _gender release ] ;
[ super dealloc ] ;
}
@end