您的位置:首页 > 编程语言 > C语言/C++

黑马程序员-[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

代码实现如下:

@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)作用,定义私有变量和方法,不能被子类继承;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: