OC中内存管理、KVC、代码块、协议

内存管理:MRC

//1、工程是MRC需要修改target ->Build Setting ->搜索auto->然后将automic Reference counting  改为NO
        //内存管理的黄金法则 :谁retain 谁release 谁创建谁释放
        //retain 、copy、alloc、new 这些都会让对象的计数器加1
        //release 计数器减1
        //dealloc 释放对象的方法 系统自动调用
        //MRC工程里面混编ARC需要更改为-fobjc-arc

ARC

 //两个对象相互引用的时候,有一方的@property的参数需要改成weak 否则两个对象都释放不掉
  //ARC工程里面混编MRC 在MRC的类上添加 -fno-objc-arc

KVC:

//KVC是键值编码 key-value coding 通过KVC可以设置类属性的值
    //setValue为设置的值 forKey为相应的属性的键
    //设置值
    setValue: forKey:
    //取值
    valueForKey:
    //kvc设置类属性的值
       [person setValue:@"光头强" forKey:@"name"];
    //KVC方式获得值 设置人的属性
       NSString *personName = [person valueForKey:@"name"];
    // 异常:this class is not key value coding-compliant for the key nam.' 那么去检查你设置键在相应的类中是否存在
         //键路径 setValue: forKeyPath:
       [person setValue:tree forKeyPath:@"forest.tree"];
       //用键路径的时候需要注意各个对象间的关系 通过基础的键属性去找相应对象下面的键属性
       //快速运算 @count求总数量 @avg平均数 @sum求和 @max最大值 @min最小值
       //针对于对象的是否去重
       //@distinctUnionOfObjects去重 @unionOfObjects不去重

代码块:

//代码块 定义一个无返回值整型参数的代码块  返回值类型(^代码块名字)(参数类型) = ^(参数列表){body};
//代码块的调用 代码块名字(实参);
        myBlock(20);
//注意:代码块给同时定义的本地变量在代码块内部做了一个只读的备份 所以在代码块内部不能修改本地变量的值
 //代码块当参数传递
     NSArray *sortedArray =   [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
         return [obj2 compare:obj1];
        }];
        NSLog(@"sorted:%@",sortedArray);
// 在代码块内部修改本地变量的值需要在变量前面加static 、 __block 这两者的区别就是出了函数static关键字还能用 但是__block不能用
//      typedef声明了一个代码块类型 需要注意的是在代码块前面加这个关键字 不能给代码块初始化
//代码块的递归 注意:需要将代码块声明为全局变量或者是静态变量

协议:

//创建协议 在h文件中协议的编写格式如下
        //#import <Foundation/Foundation.h>
        
//        @protocol myProtocol <NSObject>
//            method
//        @end
        //遵守协议 符号<>
        //基协议 NSObject
        //限制某个对象遵守协议
        //注意:谁遵守谁实现
//判断Person 类中是否存在run方法需要注意的是参数的方法后面需要加冒号
        if ([person respondsToSelector:@selector(run)]) {
            NSLog(@"yes");
        }else{
            NSLog(@"no");
        }
//在协议中写@property 那么在遵守协议的类中需要写@synthesize name = _name;
//类遵守协议 在实现文件中实现协议的必要实现的方法 如果父类遵守某协议,那么子类也遵守但是不用实现协议里面的方法,如果子类中需要的方法父类没有实现,子类再去实现


你可能感兴趣的:(内存管理,协议,KVC,代码块)