美文网首页iOS在路上
iOS分类Category使用的思考

iOS分类Category使用的思考

作者: Steven_Wu | 来源:发表于2017-01-26 20:33 被阅读31次
    1. 如果创建分类,只是为了重写原类的某个方法,那么创建了分类后,可以将分类的.h文件删除,只留.m文件。分类.m文件会被自动编译,编译后分类中的实现会覆盖原来的实现,故使用时只需要导入原类.h,不需要导入分类.h/或.m文件。

    2.如果创建分类,只是为了重写原来类的方法,那么也可以将多个分类的实现部分,统一放在一个WZCategory.m中,拖入项目中,会被自动编译。

    3.如果创建分类,是为了给原来类增加新的方法,那么必须得保留.h文件,并且在.h中为新增的方法进行申明,在需要使用时,需要同时导入原类.h和分类.h,才能调用相应方法。

    代码示例:
    // NullSafe.m  
    
    #import <objc/runtime.h>
    #import <Foundation/Foundation.h>
    
    @implementation NSNull (NullSafe)  //只要这种写法,系统便知道是NSNull的分类,以下方法的优先级高于原来类
    - (NSMethodSignature *)methodSignatureForSelector:(SEL)selector
    {
        //重写内容
    }
    @end
    
    //  SuperLog.m  //文件名取什么无所谓,项目中所有.h/.m/.c文件都会被自动编译,@implementation NSDictionary (Log)会被自动识别为分类。
    //
    
    #import <Foundation/Foundation.h>
    
    @implementation NSDictionary (Log)
    
    - (NSString *)descriptionWithLocale:(id)locale
    {
        NSMutableString *string = [NSMutableString string];
        
        // 开头有个{
        [string appendString:@"{\n"];
        
        // 遍历所有的键值对
        [self enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
            [string appendFormat:@"\t%@", key];
            [string appendString:@" : "];
            [string appendFormat:@"%@,\n", obj];
        }];
        
        // 结尾有个}
        [string appendString:@"}"];
        
        // 查找最后一个逗号
        NSRange range = [string rangeOfString:@"," options:NSBackwardsSearch];
        if (range.location != NSNotFound)
        [string deleteCharactersInRange:range];
        
        return string;
    }
    
    @end
    
    
    @implementation NSArray (Log)
    
    - (NSString *)descriptionWithLocale:(id)locale
    {
        NSMutableString *string = [NSMutableString string];
        
        // 开头有个[
        [string appendString:@"[\n"];
        
        // 遍历所有的元素
        [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
            [string appendFormat:@"\t%@,\n", obj];
        }];
        
        // 结尾有个]
        [string appendString:@"]"];
        
        // 查找最后一个逗号
        NSRange range = [string rangeOfString:@"," options:NSBackwardsSearch];
        if (range.location != NSNotFound)
        [string deleteCharactersInRange:range];
        
        return string;
    }
    
    @end
    
    

    相关文章

      网友评论

        本文标题:iOS分类Category使用的思考

        本文链接:https://www.haomeiwen.com/subject/snxfittx.html