1.block的使用与理解:
(1)block是一个独立的代码块,可以当做参数传,从而提高代码的复用性与可读性。
(2)block可以当做函数的参数传递:-(void)getArea:(void(^)(int W,int H))block;
(3) block也可以当做属性传值:@property(nonatomic,copy)void(^block)(NSString *)name
***注意:block作属性传值的时候,要用copy修饰,因为block是分配在栈里面的不需要程序员手动管理,但是我们使用时是在堆里面操作所以需要copy一份进行操作;当在block里面进行操作时,初始化变量,在block外要记得用__block(MRC中,ARC用__weak修饰符)对实例变量进行修饰,从而避免循环应用。
例子:
- brush.getCardInfo=^(NSDictionary *info){
- [self test];
- };
但是这又带来另一个问题,就是self的引用计数+1。这意味着很可能会导致循环引用。self持有brush,brush持有block,block持有self。结果就是内存泄漏。
解决的办法如下:
- __block CurrentViewController* blockSelf = self;
- brush.getCardInfo=^(NSDictionary *info){
- [blockSelf test];
- };
通过这个方式,告诉block这个变量的引用计数不要+1。
2.单例的理解与使用:
(1)单例模式就是一个实例,保证一个类只有一个实例,单例的方法是一个类方法,保证类中的对象只会被初始化一次,从而避免对象里面的数据再次初始化而清空。
(2)单列的优点
(3)在oc中创建单例类的步骤:
01.声明一个静态变量并置为空:static Tree *tree = nil;
02.实现单例的方法:
+(id)manager
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
trees = [[Tree alloc]init];
NSLog(@"我是一个单列");
});
return trees;
}
在另一个类调用时,只需要用单例的类调用即可。+
+
}