感悟

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  *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

你可能感兴趣的:(感悟)