【记个代码】不包含系统类
第一个版本有几个问题:
objc_copyClassNamesForImage
的返回值未free
- 未做严格的判空
// 获取工程里的所有类
- (NSArray <NSString *>*)getResourceClassNames {
NSArray *(^block)(const char *) = ^(const char *imageName) {
unsigned int classCount;
const char **classes = objc_copyClassNamesForImage(imageName, &classCount);
NSMutableArray *arr = nil;
if (classes && classCount) {
arr = [NSMutableArray arrayWithCapacity:classCount];
for (int i = 0; i < classCount; i++) {
const char *name = classes[i];
NSString *clsName = [NSString stringWithCString:name encoding:NSUTF8StringEncoding];
[arr addObject:clsName];
}
free(classes); // runtime中包含copy的方法都需要手动free
}
return arr.copy;
};
NSString *bundleName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"];
unsigned int imageCount = 0;
const char **imageList = objc_copyImageNames(&imageCount);
NSUInteger totalCount = 0;
// image : classes names,先存dic,说不定有啥用
NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithCapacity:64];
if (imageList && imageCount) {
for (int i = 0; i < imageCount; i++) {
NSString *img = [NSString stringWithCString:imageList[i] encoding:NSUTF8StringEncoding];
if ([img rangeOfString:bundleName].location != NSNotFound) {
NSArray *arr = block(imageList[i]);
if (arr) {
dic[img] = arr;
totalCount += arr.count;
}
}
}
free(imageList);
}
NSMutableArray *arr = [NSMutableArray arrayWithCapacity:totalCount];
[dic enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, NSArray *_Nonnull obj, BOOL * _Nonnull stop) {
[arr addObjectsFromArray:obj];
}];
return arr.copy;
}