内存管理: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;
//类遵守协议 在实现文件中实现协议的必要实现的方法 如果父类遵守某协议,那么子类也遵守但是不用实现协议里面的方法,如果子类中需要的方法父类没有实现,子类再去实现