快速接手新项目技巧:使用Runtime找到UIImage名字

来自:搬砖的码农

在新接手的项目上做开发是比较慢的,尤其是开发、产品、设计都换了几波人的上了年纪的项目。其实我们还是可以通过一些途径来提高维护老项目的效率。比如今天(全新的开发人员、产品、设计)就碰到设计说新做的需求有一个切图是app中原来就有的,为了保持风格统一,沿用原来的切图。难道还需要定位到当前的页面对应的代码中去寻找相应图片的名字吗?如果后面的新需求有大量类似的图片怎么办?经过一番思考,确定了一种比较快速定位图片名字的方法。如下:


第一步:给UIImage添加name属性


利用runtime在UIImage的分类中给UIImage关联一个属性p_name,替换原来的imageNamed:方法,在自己的方法中将图片的名字保存到p_name中。

#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface UIImage (name)
@end
NS_ASSUME_NONNULL_END


#import "UIImage+name.h"
#import <objc/runtime.h>

@implementation UIImage (name)
- (void)setP_name:(NSString *)p_name {
    objc_setAssociatedObject(self@selector(p_name), p_name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(NSString *)p_name {
    return objc_getAssociatedObject(self, _cmd);
}
+ (UIImage *)wsk_imageNamed:(NSString *)imageName {
    UIImage *image = [UIImage wsk_imageNamed:imageName];
    image.p_name = imageName;
    return image;
}
+(void)load {
    Method imageNameMethod = class_getClassMethod([self class], @selector(imageNamed:));
    Method wsk_imageNamedMethod = class_getClassMethod([UIImage class], @selector(wsk_imageNamed:));
    method_exchangeImplementations(imageNameMethod, wsk_imageNamedMethod);
}
@end


第二步:找到目标UIImageVIew的地址


 方法一:不借助任何外部工具,使用xcode的Debug View Hierarchy


 方法二:使用Chisel命令pviews。



 方法三:使用工具FLEX找到UIImageVIew的地址。


第三步:打印图片的名字


使用LLDB的po命令 po [((UIImageView*)0x122203f40).image valueForKey:@"p_name"] 打印图片的名字。


注意:xib中设置的图片名字,打印为nil


视频转GIF步骤

 1、brew install ffmpeg

 2、ffmpeg -ss 00:00:00 -i flex.mov -s 375x667 -r "2" flex.gif

推荐↓↓↓
iOS开发
上一篇:TikTok(抖音国际版)逆向,全球的小姐姐们,我来啦! 下一篇:移动端的那些坑