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;
};
}];
- [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;
- [[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。
在这里: