黑马程序员-[OC语言] 第四篇:ARC机制、类别 概述

------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:

黑马程序员-[OC语言] 第四篇:ARC机制、类别 概述_第1张图片

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 

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


你可能感兴趣的:(黑马学习笔记-OC语言)