您的位置:首页 > 移动开发 > Objective-C

OC内存管理高级

2015-10-22 20:49 405 查看
一、属性的内部实现原理
1、assign
"Person.h":

@interface Person : NSObject

@property (nonatomic,retain)NSString *name;
@property (nonatomic,assign)NSInteger age;
@property (nonatomic,copy)NSString *gender;
@property (nonatomic,retain)Car *car;

- (instancetype)initWithName:(NSString *)name age:(NSInteger)age gender:(NSString *)gender;
+ (Person *)personWithName:(NSString *)name age:(NSInteger)age gender:(NSString *)gender;

@end


"Person.m":

@synthesize name = _name;
- (void)setName:(NSString *)name{
if (_name != name) {
[_name release];
_name = [name retain];
}
}

- (NSString *)name{
return [[_name retain] autorelease];
}

@synthesize age = _age;
- (void)setAge:(NSInteger)age{
_age = age;
}

- (NSInteger)age{
return _age;
}

@synthesize gender = _gender;
- (void)setGender:(NSString *)gender{
if (_gender != gender) {
[_gender release];
_gender = [gender copy];
}
}

- (NSString *)gender{
return [[_gender retain] autorelease];
}

- (void)dealloc{
[_name release];
[_gender release];
[_car release];
NSLog(@"%@的对象被释放了!!!",self);
[super dealloc];
}

- (instancetype)initWithName:(NSString *)name age:(NSInteger)age gender:(NSString *)gender{
self = [super init];
if (self) {
//        [self setName:name];
//        [self setAge:age];
//        [self setGender:gender];
self.name = name;
self.age = age;
self.gender = gender;
//        self.car = [[Car alloc]initWithBrand:@"奥迪" color:@"银色" price:@"四十万"];
//        [self.car release];
_car = [[Car alloc]initWithBrand:@"奥迪" color:@"银色" price:@"四十万"];
}
return self;
}
+ (Person *)personWithName:(NSString *)name age:(NSInteger)age gender:(NSString *)gender{
Person *person = [[Person alloc]initWithName:name age:age gender:gender];
return [person autorelease];
}


2、retain

@synthesize name = _name;
- (void)setName:(NSString *)name{
if (_name != name) {
[_name release];
_name = [name retain];
}
}

- (NSString *)name{
return [[_name retain] autorelease];
}


3、copy

@synthesize gender = _gender;
- (void)setGender:(NSString *)gender{
if (_gender != gender) {
[_gender release];
_gender = [gender copy];
}
}

- (NSString *)gender{
return [[_gender retain] autorelease];
}

二、dealloc

dealloc是NSObject的一个实例方法,与alloc对应,用于回收开辟的内存空间
这个方法在对象引用计数为0时,由系统自动调用 
通常我们在dealloc中释放类的实例变量
- (void)dealloc {
[_name release];
[_gender release];
[_car release];

NSLog(@"%@的对象被释放了",self);

[super dealloc];
}


dealloc的注意事项:

永远不要手动调用dealloc.
在dealloc方法的最后一行,必须要写[super dealloc];
三、便利构造器的内存管理
+ (Person *)personWithName:(NSString *)name age:(NSInteger)age gender:(NSString *)gender {
Person *person = [[Person alloc] initWithName:name age:age gender:gender];
return [person autorelease];
}


return [person autorelease]是最完美的解决方案,既不会内存泄露,也不会产生野指针。

四、collection的内存管理

collection就是NSArray,NSDictionary,NSSet…等容器类
collection会自主管理自己内部的元素
(1)加入collection中的对象会被retain
(2)移除出collection的对象会被release
(3)collection被释放会对内部所有对象release
五、多态

面向对象的三大特性之一。
不同类型对象在响应同一个方法时的不同实现。
父类指针可以指向子类对象
多态的特点:
(1)父类指针可以指向不同的子类对象
(2)允许在多个类中定义同一个消息接口。
(3)可以屏蔽不同子类对象之间的差异,写出通用代码。
(4)适应需求的不断变化
//多态(多种形态)
//有 多态 必须 有继承。

//        NSObject *s = [Dog new];
//        NSObject *a = [Animal new];

Dog *dog = [Dog new];
[dog eat];

//多态的语法格式 是 父类指针指向子类对象。
Animal *animal = [Dog new];

//        Dog *d = [Animal new];

//方法执行时,系统会动态检测(动态绑定)到底是什么对象。确定之后,会执行相应类内部的方法。
[animal eat];

Cat *cat = [Cat new];

feed(dog);
feed(cat);

//父类指针如果访问了子类中的私有方法,就会出现警告。
Animal *a = [Dog new];
Dog *d = (Dog *)a;

[d run];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  objective-c