感悟

作者: 萨缪 | 来源:发表于2020-10-14 12:42 被阅读0次

    1.内存优化实际上就是看在内存使用过大的时候使用Instrument工具看看是哪些大的对象没有被释放导致,看某些被缓存到本地的图片没用,这些本地的影响的是磁盘缓存,不影响此时内存的使用。
    2.for 循环检测一个Array时最好用锁锁住,防止for循环遍历途中又新增元素。
    3.判断可变数组/字典是否存在:

    if (self.Array.count == 0) {
            
                self.Array = [@[] mutableCopy];
    
        }
        if (self.Dict.count == 0) {    
                self.Dict = [@{} mutableCopy];
        }
    

    4.遍历某个目录下文件,获取文件配置信息的方法:

    fileDir:目录
        NSArray *f= [fileManager contentsOfDirectoryAtPath:fileDir error:error];
        NSMutableArray *fileArray = [[NSMutableArray alloc] init];
        
            for (NSString *fileName in f) {
                NSString *filePath = [fileDir stringByAppendingPathComponent:fileName];
                NSDictionary <NSFileAttributeKey, id> *Attribute = [fileManager attributesOfItemAtPath:filePath error:error];
    }
    

    5.数组排序方法

    [fileArray sortUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
                 if ([obj1 integerValue] > [obj2 integerValue]) {  
            return (NSComparisonResult)NSOrderedDescending;  
        }  
       
        if ([obj1 integerValue] < [obj2 integerValue]) {  
            return (NSComparisonResult)NSOrderedAscending;  
        }  
        return (NSComparisonResult)NSOrderedSame;  
    };  
            }];
    
    1. [NSURL URLWithString:]这个如果参数是nil会crash

    7.iOS判断是否为野指针 该方法非常有效!!!

    if(!malloc_zone_from_ptr((__bridge const void *)(strongself)))return;
    

    7._cmd的作用域只在当前方法里,直指当前方法名@selector.这样处理好处是,该方法相对化简了繁文缛节,并且可读性良好。不容易写错key
    比如:

    - (void (^)(Player * , BOOL))WillChange {
        return objc_getAssociatedObject(self, _cmd);
    }
    

    等价于

    - (void (^)(Player * , BOOL))WillChange {
        return objc_getAssociatedObject(self, @selector(WillChange));
    }
    

    8.debug模式下如果需要测试 可以覆盖本类的方法,这一技巧可以用在setting设置中,本地开关返回值在正式环境下可被强制配置的ControlS开关 在获取该开关值的类对应的分类中,重写获取方法,当方法参数 == 该开关名称时 返回本地存储的该同名开关值 NSUserDefaults 很有效的方法!

    9.使用RGB颜色时,一定要注意都是float类型! 不要两个int 型相除,切记不要:

    [action1 setValue:[UIColor colorWithRed:142/255 green:210/255 blue:255/255 alpha:1] forKey:@"titleTextColor"];
    

    而要转为float类型 .0

    [action1 setValue:[UIColor colorWithRed:142.0/255.0 green:210.0/255.0 blue:255.0/255.0 alpha:1] forKey:@"titleTextColor"];
    

    10.viewDid/WillAppear/Disappear 会在视图被隐藏时调用 !!! 不止是视图被移除remove时!!!

    11.如果发现这种报错

    duplicate symbol '_OBJC_METACLASS_$_GdtNativeProtocolParser' in:
        /Users/jingpengxu/Library/Developer/Xcode/DerivedData/SDK-ggrxmhcffaekvpgfecporbjdlbbg/Build/Products/Debug-iphoneos/LandingPage/LandingPage.a(ProtocolParser 2.o)
        /Users/jingpengxu/Library/Developer/Xcode/DerivedData/SDK-ggrxmhcffaekvpgfecporbjdlbbg/Build/Products/Debug-iphoneos/LandingPage/LandingPage.a(ProtocolParser.o)
    ld: 37 duplicate symbols for architecture arm64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    

    使用 nm命令先查看 该文件里是否有两个 ProtocolParser !!!

    12.音频

    对于有播放器AVplayer的代码 他有一个单独控制的volume可以修改
    修改它不会修改当前的系统音量,而是会在当前系统音量的比例之上,按比例缩小音量,比如AVPlayer.volume = 0.3 则音量变为当前系统音量的0.3倍!~

    13.注意 使用 XCTestExpectation * 存在多个 fulfill 语句时,一定要记得置空!!! 每次都置空!!!

    [self.ShowExpectation fulfill];
    self.ShowExpectation = nil;
    
    1. [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:15]];
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:15]];
    

    这句代码的含义是主线程等待15秒 可用于单元测试 因为一般单元测试方法执行完很短一段时间后程序就退出了,如果有一些操作耗时比较久,可能来不及执行fullfill语句,所以用这条语句延迟该方法的结束时间从而延迟退出。

    15.针对断言 NSASSERT 在工程中有一个设置,可以根据不同环境的包(debug/release),而选择是否让所有的断言有效。
    步骤如下:
    1.确定NSASSERT断言所在文件
    2.确定该文件位于哪个工程下
    3.确定该工程的Assert字段在不同包配置下为NO或者YES。
    在这里:


    图片.png

    相关文章

      网友评论

          本文标题:感悟

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