【知识总结】写法

1,默认的初始化数据,在初始化方法中进行设置

比如:NSInterge _selectedIndex;
默认情况下设置为 _selectedIndex = 1;
如果在 viewDidload 方法中进行默认是的设置 ,外界在设置 _selectedIndex = 2 的时机在 viewDidload 之前,则这次的设置就会被重置为 1。

因此,初始化的默认值推荐在初始化中进行设置


XMNetworking

2,队列写法

static dispatch_queue_t xm_request_completion_callback_queue() {
    static dispatch_queue_t _xm_request_completion_callback_queue;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _xm_request_completion_callback_queue = dispatch_queue_create("com.xmnetworking.request.completion.callback.queue", DISPATCH_QUEUE_CONCURRENT);
    });
    return _xm_request_completion_callback_queue;
}

上面的这种书写方式,便于之后的队列调用,如:

dispatch_async(xm_request_completion_callback_queue(), ^{
                completionHandler(nil, serializationError);
            });

3,信号量:使用宏定义

dispatch_semaphore_t _lock;
_lock = dispatch_semaphore_create(1);

#define XMLock() dispatch_semaphore_wait(self->_lock, DISPATCH_TIME_FOREVER)
#define XMUnlock() dispatch_semaphore_signal(self->_lock)

4,block 使用 宏 调用

#define XM_SAFE_BLOCK(BlockName, ...) ({ !BlockName ? nil : BlockName(__VA_ARGS__); })

// 调用:
XM_SAFE_BLOCK(self.requestProcessHandler, request);

AOP 中的方法替换写法:

+ (void)load{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Class class = [self class];
        
        SEL originalSelector = @selector(setCachePolicy:);
        SEL swizzledSelector = @selector(ag_setCachePolicy:);
        
        Method originalMethod = class_getInstanceMethod(class, originalSelector);
        Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
        
        BOOL success = class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));
        if (success) {
            class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
        } else {
            method_exchangeImplementations(originalMethod, swizzledMethod);
        }
    });
}

多个方法需要替换,可以使用下面方式

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSArray *selStringsArray = @[@"reloadData", @"reloadRowsAtIndexPaths:withRowAnimation:", @"deleteRowsAtIndexPaths:withRowAnimation:", @"insertRowsAtIndexPaths:withRowAnimation:"];
        [selStringsArray enumerateObjectsUsingBlock:^(NSString *selString, NSUInteger idx, BOOL *stop) {
            NSString *mySelString = [@"sd_" stringByAppendingString:selString];
            
            Method originalMethod = class_getInstanceMethod(self, NSSelectorFromString(selString));
            Method myMethod = class_getInstanceMethod(self, NSSelectorFromString(mySelString));
            method_exchangeImplementations(originalMethod, myMethod);
        }];
    });
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,010评论 19 139
  • 把网上的一些结合自己面试时遇到的面试题总结了一下,以后有新的还会再加进来。 1. OC 的理解与特性 OC 作为一...
    AlaricMurray阅读 2,617评论 0 20
  • 史上最全的iOS面试题及答案 迷途的羔羊--专为路痴量身打造的品牌。史上最精准的定位。想迷路都难!闪电更新中......
    南虞阅读 1,552评论 0 8
  • iOS面试小贴士 ———————————————回答好下面的足够了------------------------...
    不言不爱阅读 2,014评论 0 7
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 3,387评论 0 6