我的iOS学习历程 - OC第十天
2015-11-07 17:49
417 查看
今天学习的有:
一.内存的高级管理
二.多态
一.内存的高级管理
在这里写的是如何在需要内存管理时候的setter,getter方法,自定义初始化,遍历构造器的实现写法:
例如下面的Student类:
1.自定义初始化
2.遍历构造器
3.setter,getter方法
下面是属性的属性为copy时
而重写dealloc方法时候要注意对_name的释放(预防出现野指针)
注意:当数组,字典,集合添加元素时,会使添加的元素引用计数 +1,而对数组,字典,集合release(释放)的时候,同时会给元素发送release消息,让每个元素的引用计数-1
多态的真谛:
父类指针 指向 子类对象(应用如 addSubview:UIView,UIView里可以填Button)
例如:一个动物类有两个子类狗和猫,另外一个学生类在调用方法喂食动物的时候,在主函数中用动物类来声明一个狗类和一个猫类,在学生类喂食动物的方法中加入动物类的参数就会调用加入的类的方法,例如参数填入一个用动物类来声明的狗类,就回去调用狗类的方法.
Animals.h:
Animals.m:
猫狗类分别重写了动物类里面的eat方法
Student类中的喂动物方法:
这样调用:
一.内存的高级管理
二.多态
一.内存的高级管理
在这里写的是如何在需要内存管理时候的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];// 这样结果是输出猫吃
相关文章推荐
- IOS 字符串中去除特殊符号 stringByTrimmingCharactersInSet
- 短信验证 掌淘 mob 1.1.1开发实例
- ios新手如何看xcode缓存路径
- iOS开发拓展篇—音效的播放
- 线程的坑
- ios多线程编程
- OSX/iOS中多路I/O复用总结
- (iOS)Storyboard 与 initWithCoder -- designated initializer小结
- IOS 的plis他 用法 小样
- IOS 的 plist方法 好记性不如看博客
- [转]iOS容易造成循环引用的三种场景,就在你我身边!
- ios常用的延时操作
- 解决IOS9友盟分享时明明安装了相关的分享软件,却提示未安装的问题
- iOS崩溃日志分析
- iOS 程序进入后台到底发生了什么?
- iOS-----使用AVAudioPlayer播放音乐
- ios9 XIB加载缓慢
- iOS之富文本
- iOS多线程编程之NSThread的使用
- iOS中常用的四种数据持久化方法简介