1、c语言回调可以用self的静态传入调用方法,也可以用类设置delegate传出来,记得置nil
static class objectSelf;
objectSelf = self;
void cFunction(){
[objectSelf invokeOCFunction];
}
ps:记得在合适的地方把objectSelf置nil
2、try catch 时要注意内存管理
try catch 时要注意内存管理,MRC下可以增加@finally中release对象;
但是在ARC中时,系统是在allocinit之后插入的内存管理代码,在trycatch一样会受到影响,这样会导致内存泄露(占用的栈内存,由系统管理,多了会影响app性能);
解决办法是可以打开文件的-fobjc-arc-exceptions,让系统增加异常安全处理代码来跟踪清理对象,在objective-c++中,这个会默认开启。(备注:开启这个并不理想,这样的处理多了还会影响性能,因此oc中最好用error保证代码质量,而不是try-catch,而且oc中trycatch能捕获的异常我们基本都能预防,所以try catch很少用)
例如下面的代码就有问题:
@try{
NSMutableArray * a = @[@"1",@"2"].mutableCopy;
[a removeObjectAtIndex:3];
}@catch(NSException * ex){
NSLog(@"reason:%@",ex.reason);
}
可以用自动释放池来处理:
for (int i = 0 ; i< 10000; i++) {
@autoreleasepool{
@try{
NSMutableArray * a = [[NSMutableArray alloc] initWithArray:@[@"1",@"2"]];
[a removeObjectAtIndex:3];
}@catch(NSException * ex){
NSLog(@"reason:%@",ex.reason);
}
}
}
3、委托模式delegate
自己写的委托模式下每次都要调用response方法,这个会影响性能,可以在setdelegate的时候,设置unsigned int:1 的结构体,能响应,设值为1,这样在response的时候判断是不是1就可以了
typedef struct{
unsigned int canResponse :1;///可以表示0~1(位段,bitfield)
unsigned int canResponseEight : 8;///表示0~255
}DelegateResponse;
{
DelegateResponse delegateResponse;
}
- (void)setDelegate:(id<AAAProtocol>)delegate{
_delegate = delegate;
delegateResponse.canResponse = [_delegate respondsToSelector:@selector(eat)];
}
if (delegateResponse.canResponse) {
[self.delegate function];
}
4、尽可能少引入头文件
优化编译速度,引入的头文件尽可能的少,比如只是用到类名,可以用@class
参考资料:《编写高质量ios与os x代码的52个有效方法》