------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)作用,定义私有变量和方法,不能被子类继承;