今天学习的有:
一.内存的高级管理
二.多态
一.内存的高级管理
在这里写的是如何在需要内存管理时候的setter,getter方法,自定义初始化,遍历构造器的实现写法:
例如下面的Student类:
1.自定义初始化
-(instancetype)initWithAge:(NSInteger)age
name:(NSString *)name
{
self = [super init];
if (self) {
// 学了属性和内存之后
// 不要出现_name
// 全部写 self.
_age = age;
self.name = name;
// 这种赋值方式 对于基本数据类型是安全的
// 对于对象类型 赋值是不安全的 应该调用set方法 进行赋值 保证内存的安全
}
return self;
}
2.遍历构造器
+(instancetype)studentWithAge:(NSInteger)age
name:(NSString *)name
{
Student *s = [[Student alloc]initWithAge:age name:name];
return [s autorelease];
}
3.setter,getter方法
-(void)setAge:(NSInteger)age{
_age = age;
}
-(NSInteger)age{
return _age;
}
// 主要注意的是属性的属性为retain和copy的写法
-(void)setName:(NSString *)name{
if (_name != name) {
[name release];
_name = [_name retain];
}
}
-(NSString *)name{
return [[_name retain]autorelease];
}
下面是属性的属性为copy时
-(void)setName:(NSString *)name{
if (_name != name) {
[name release];
_name = [_name copy];
}
}
// 注意的是Copy和retain的写法大致相同 基本上使用的都是retain
-(NSString *)name{
return [[_name retain]autorelease];
}
而重写dealloc方法时候要注意对_name的释放(预防出现野指针)
-(void)dealloc{
[_name release];
[super dealloc];
}
注意:当数组,字典,集合添加元素时,会使添加的元素引用计数 +1,而对数组,字典,集合release(释放)的时候,同时会给元素发送release消息,让每个元素的引用计数-1
二.多态
多态的真谛:
父类指针 指向 子类对象(应用如 addSubview:UIView,UIView里可以填Button)
例如:一个动物类有两个子类狗和猫,另外一个学生类在调用方法喂食动物的时候,在主函数中用动物类来声明一个狗类和一个猫类,在学生类喂食动物的方法中加入动物类的参数就会调用加入的类的方法,例如参数填入一个用动物类来声明的狗类,就回去调用狗类的方法.
Animals.h:
@interface Animals : NSObject
-(void)eat;
@end
Animals.m:
@implementation Animals
-(void)eat{
NSLog(@"动物吃");
}
@end
猫狗类分别重写了动物类里面的eat方法
Student类中的喂动物方法:
-(void)eatToAnimals:(Animals *)animal{
Animals *a = animal;
[a eat];
}
这样调用:
Animals *d = [[Dog alloc]init];
Animals *c = [[Cat alloc]init];
Student *s = [[Student alloc]init];
[s eatToAnimals:c];// 这样结果是输出猫吃