黑马程序员-[OC语言] 第四篇:ARC机制、类别 概述
2015-08-17 20:34
781 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------
OC加强--第二天学习视频总结:
1 outorelese注意及错误用法:
1)并不是所有的放到自动释放池中的代码,产生的对象就会自动释放,如果需要释放,必须加入到自动释放池;
2)如果对象调用了autorelease,但是调用的时候,没有在任何一个自动释放池中,此时该对象也不会,被加入到自动自动释放池中。
3)自动释放池中,不适宜放占用内存较大的对象;
2. id 和instance的使用:
1)instancetype只能作为函数或者方法的返回值;
2)Id 能作为方法或者函数的返回值,参数类型,也能用来定义变量;
3)instancetype 对比Id的好处是:能精确的限制返回值的具体类型;
3. ARC 概念及原理:
1)指针分类:默认情况下,我们使用的都是强指针,定义格式为,__strong 指针名, 弱指针定义为:__weak 指针名。
2) APC的判断准则:只要没有强指针指向对象,对象就会被立即释放。
3)APC时OC编译器的特性,而不是运行时特性或者垃圾回收机制,ARC 做的只是在代码编译时为你自动的在合适的位置插入release或者autorelease.
4.APC内存管理机制:
1)在ARC下,@property 中 set方法参数,原子性/读写 和MRC下是一样的。
2)ARC中的@property:
3)在ARC情况下,解决循环引入问题方法为:在@property一边用strong 一边要用weak。
4)APC特点总结及注意事项:
(1)APC中,只要弱指针指向的对象不再了,就直接把弱指针做清(赋值为nil)空操作.
(2)ARC中在property处不再使用retain,而是使用strong ,在dealloc中不再需要[super dealloc].
(3)如果换成弱指针,则要换成weak,不需要再加__.
5.APC的兼容和转换:
1)ARC模式下如何兼容非ARC的类:
让程序集兼容ARC和非ARC部分,转变为非ARC -fro-objc-arc 转变为ARC-f-objc-are 一般是在MRC文件中添加 -fro-objc-arc 让ARC文件兼容MRC文件。
2)MRC模式下如何转换非ARC的类:
edit—>refacter—>convert to OC ARC
6.分类(category)概念及使用流程:
1)作用:在不修改原有的类的基础上增加新的方法;一个庞大的类分模块开发;一个庞大的类可以由多个人来编写,更有利于团队合作。
2)使用分类的目的:(1)对现有类进行扩展,(2)作为子类的替代手(3)对类中的方法归类;
3)使用分类的步骤:但声明分类--》实现分类--》使用分类;
4)分类的命名规则:类名+扩展方法。
分类的定义方法:
7. 分类的声明和实现:
1)使用步骤:
1) 声明一个分类
格式:
@interface 待扩展的类名 (分类的名称)
@end
Person+base -->分类文件的命名规则
eat run
2) 实现这个分类
格式:
@implementation 待扩展的类 (分类的名称)
@end
代码实现如下:
8.分类的使用注意事项:
1)在分类的声明中不能声明实例变量,同时也不能使用@property 定义变量。
2)在分类的方法中,可以访问类中的实例变量;
3)在分类中存在和类同名的方法,优先访问的是分类中的方法;
4)分类中的编译顺序:最下面的事最后编译的,当多个分类中有同名方法,则执行最后编译的文件方法;
9.分类的非正式协议:
1)非正式协议通常为定义为NSObjectde 的类别;类别接口中指定的方法可能会或者可能不会被框架类实际的实现,而是被子类重写;
2)所谓的非正式协议就是类别,即凡是NSObjec或其子类的类别,都是非正式协议。
实例:统计字符中的数字个数:
10.分类的延展:
1.延展的代码定义实现:
2.延展的注意事项:
1)延展的概念:延展的类别又称为扩展
2)可以在 延展中定义实例变量;
3)不能使用@implementation 类名()实现类别的方法。
4)作用,定义私有变量和方法,不能被子类继承;
OC加强--第二天学习视频总结:
1 outorelese注意及错误用法:
1)并不是所有的放到自动释放池中的代码,产生的对象就会自动释放,如果需要释放,必须加入到自动释放池;
2)如果对象调用了autorelease,但是调用的时候,没有在任何一个自动释放池中,此时该对象也不会,被加入到自动自动释放池中。
3)自动释放池中,不适宜放占用内存较大的对象;
2. id 和instance的使用:
1)instancetype只能作为函数或者方法的返回值;
2)Id 能作为方法或者函数的返回值,参数类型,也能用来定义变量;
3)instancetype 对比Id的好处是:能精确的限制返回值的具体类型;
3. ARC 概念及原理:
1)指针分类:默认情况下,我们使用的都是强指针,定义格式为,__strong 指针名, 弱指针定义为:__weak 指针名。
2) APC的判断准则:只要没有强指针指向对象,对象就会被立即释放。
3)APC时OC编译器的特性,而不是运行时特性或者垃圾回收机制,ARC 做的只是在代码编译时为你自动的在合适的位置插入release或者autorelease.
4.APC内存管理机制:
1)在ARC下,@property 中 set方法参数,原子性/读写 和MRC下是一样的。
2)ARC中的@property:
3)在ARC情况下,解决循环引入问题方法为:在@property一边用strong 一边要用weak。
4)APC特点总结及注意事项:
(1)APC中,只要弱指针指向的对象不再了,就直接把弱指针做清(赋值为nil)空操作.
(2)ARC中在property处不再使用retain,而是使用strong ,在dealloc中不再需要[super dealloc].
(3)如果换成弱指针,则要换成weak,不需要再加__.
5.APC的兼容和转换:
1)ARC模式下如何兼容非ARC的类:
让程序集兼容ARC和非ARC部分,转变为非ARC -fro-objc-arc 转变为ARC-f-objc-are 一般是在MRC文件中添加 -fro-objc-arc 让ARC文件兼容MRC文件。
2)MRC模式下如何转换非ARC的类:
edit—>refacter—>convert to OC ARC
6.分类(category)概念及使用流程:
1)作用:在不修改原有的类的基础上增加新的方法;一个庞大的类分模块开发;一个庞大的类可以由多个人来编写,更有利于团队合作。
2)使用分类的目的:(1)对现有类进行扩展,(2)作为子类的替代手(3)对类中的方法归类;
3)使用分类的步骤:但声明分类--》实现分类--》使用分类;
4)分类的命名规则:类名+扩展方法。
分类的定义方法:
7. 分类的声明和实现:
1)使用步骤:
1) 声明一个分类
格式:
@interface 待扩展的类名 (分类的名称)
@end
Person+base -->分类文件的命名规则
eat run
2) 实现这个分类
格式:
@implementation 待扩展的类 (分类的名称)
@end
代码实现如下:
@interface Person (study) -(void)studyC; -(void)studyIOS; @end @implementation Person (study) -(void)studyC{ NSLog(@"那人正在学习C语言"); } -(void)studyIOS{ NSLog(@"那人正在学习IOS"); } @end
8.分类的使用注意事项:
1)在分类的声明中不能声明实例变量,同时也不能使用@property 定义变量。
2)在分类的方法中,可以访问类中的实例变量;
3)在分类中存在和类同名的方法,优先访问的是分类中的方法;
4)分类中的编译顺序:最下面的事最后编译的,当多个分类中有同名方法,则执行最后编译的文件方法;
9.分类的非正式协议:
1)非正式协议通常为定义为NSObjectde 的类别;类别接口中指定的方法可能会或者可能不会被框架类实际的实现,而是被子类重写;
2)所谓的非正式协议就是类别,即凡是NSObjec或其子类的类别,都是非正式协议。
实例:统计字符中的数字个数:
int main(int argc, const char * argv[]) { @autoreleasepool { NSString *str = @"abc123defadf123"; [str countNumForString]; NSString *str2 = [NSString stringWithFormat:@"a12asfd"]; [str2 countNumForString]; } return 0; }
#import <Foundation/Foundation.h> @interface NSString (countNum) -(void)countNumForString; @end @implementation NSString (countNum) -(void)countNumForString{ // NSLog(@"countNumForString ---->"); NSLog(@"self = %@",self); // 1 定义字符串 // 0123456789 // NSString *str = @"ad3a12"; int count = 0; // 2 循环控制 for(int i=0;i<self.length;i++){ // 3 取出字符串中的每一个字符 //characterAtIndex 取得字符串对应位置的字符 unichar ch = [self characterAtIndex:i]; // 4 判断是否是阿拉伯数字 if (ch >='0' && ch<='9') { // 5 如果是, 计数器+1 count++; } } // 6 输出统计的结果 NSLog(@"%@字符串中有%d个数字",self,count); } @end
10.分类的延展:
1.延展的代码定义实现:
@interface Person () { int _height; } -(void)work; @end
2.延展的注意事项:
1)延展的概念:延展的类别又称为扩展
2)可以在 延展中定义实例变量;
3)不能使用@implementation 类名()实现类别的方法。
4)作用,定义私有变量和方法,不能被子类继承;
相关文章推荐
- (C++ 11) 泛型算法(一)
- 黑马程序员-[OC语言] 第三篇:MRC手动内存管理总结
- C++ Read a whole File using ifstream
- 黑马程序员-[OC语言] 第二篇:继承、多态概述
- 线性表(顺序存储)C语言实现
- c/c++编译时,指定程序运行时查找的动态链接库路径
- 黑马程序员-[OC语言] 第一篇:类、对象的基本概述
- C++11新特性之自动类型判断以及匿名函数
- C++11新特性之std::bind与std::function
- C语言宏定义小结
- c++ assert
- Effective C++ 条款1 视C++为一个语言联邦
- 关于OJ G++ 、C++提交
- C语言实现 前序、中序、后序遍历二叉树
- 队列(C语言版)
- 黑马程序员-[C语言] 第四篇:文件操作总结
- c++ 内存管理
- 马踏棋盘C语言实现
- C++BuilderX8e Mysql存过程储过程的增、删、改
- c++中的点号(.),冒号(:)和双冒号(::)运算符