OC内存管理高级
2015-10-22 20:49
405 查看
一、属性的内部实现原理
1、assign
"Person.h":
"Person.m":
2、retain
3、copy
二、dealloc
dealloc是NSObject的一个实例方法,与alloc对应,用于回收开辟的内存空间
这个方法在对象引用计数为0时,由系统自动调用
通常我们在dealloc中释放类的实例变量
dealloc的注意事项:
永远不要手动调用dealloc.
在dealloc方法的最后一行,必须要写[super dealloc];
三、便利构造器的内存管理
return [person autorelease]是最完美的解决方案,既不会内存泄露,也不会产生野指针。
四、collection的内存管理
collection就是NSArray,NSDictionary,NSSet…等容器类
collection会自主管理自己内部的元素
(1)加入collection中的对象会被retain
(2)移除出collection的对象会被release
(3)collection被释放会对内部所有对象release
五、多态
面向对象的三大特性之一。
不同类型对象在响应同一个方法时的不同实现。
父类指针可以指向子类对象
多态的特点:
(1)父类指针可以指向不同的子类对象
(2)允许在多个类中定义同一个消息接口。
(3)可以屏蔽不同子类对象之间的差异,写出通用代码。
(4)适应需求的不断变化
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的内省(Introspection)用法小结
- Objective-C中常用的结构体NSRange,NSPoint,NSSize(CGSize),NSRect实例分析
- Objective-C中NSNumber与NSDictionary的用法简介
- Objective-C中NSLog输出格式大全
- Swift调用Objective-C编写的API实例
- Swift、Objective-C、Cocoa混合编程设置指南
- Objective-c代码如何移植为Swift代码 Objective-c代码转移到Swift过程介绍
- Swift调用Objective-C代码
- 以实例讲解Objective-C中的KVO与KVC机制
- objective-c中生成随机数的方法
- 在Swift中使用Objective-C编写类、继承Objective-C类
- Swift能代替Objective-C吗?
- Objective-C 消息传递机制详解
- 在一个项目中同时使用Swift和Objective-C代码混合编程的方法
- vm安装mac os x 10.7 lion
- objective-c(一)
- objective-c(二)
- objective-c(三)
- objective-c(四)-基本数据类型以及循环和选择结构