首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIImage imageNamed扩展

UIImage imageNamed扩展
EN

Stack Overflow用户
提问于 2011-09-29 22:41:03
回答 2查看 2.6K关注 0票数 1

我最近在我的应用程序中发现了一个相当大的性能问题,这是由于在UIImage imagenamed:中找不到一个图像。

我想知道是否有一种“即插即用”的解决方案来以某种方式记录这种“错误”?我开始为UIImage类编写一个扩展,如下所示:

代码语言:javascript
复制
@implementation UIImage (Debug)
#ifdef DEBUG
+ (UIImage*) imageNamed:(NSString*) name{
    UIImage* img = [UIImage imageNamed:name];

    if(!img){
        NSLog(@"Error: referencing non-exiting image: %@", name);
    }

    return img;
}
#endif
@end

但这会导致无限循环,因为UIImage imageNamed:name当然会导致再次调用扩展方法……

有什么建议吗?

谢谢托马斯

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-29 22:50:56

你不应该使用categories来覆盖现有的方法。这将导致意想不到的结果(使用的实现将取决于运行时加载二进制映像/模块的顺序)。

相反,您可以使用objc运行时来交换一个选择器与另一个选择器的实现(有时称为方法swizzling)。但是,如果你真的不知道的含义,我不鼓励你这么做。(如果您想调用原始方法以避免调用循环,则调用交换的方法,当方法在父类中实现而不是在子类中实现时管理用例,以及更多微妙之处)

如果您只想在找不到符号断点时进行调试并得到警告,请使用符号断点!(断点是的,不限于放在给定的代码行上!)

断点的功能比你想象的要强大得多(我鼓励你观看WWDC11的视频“掌握Xcode中的调试”),尤其是你可以把一个断点放在代码中的某个特定的行上,而不是放在你代码中的一个特定的行上,而是在一个特定的方法调用(在你的例子中就是-imageNamed:方法)上,然后向断点添加一个条件,这样它只会在特定的条件下被命中(返回图片nil?)。您甚至可以请求断点记录一些信息(或播放声音,或其他)和/或继续执行,而不是停止您的代码执行。

票数 6
EN

Stack Overflow用户

发布于 2011-09-29 22:51:44

您想要做的是swizzling:您交换了两个方法,这样您自己的方法现在就会被调用,并且您可以使用您的方法的名称来访问原始方法。一开始看起来有点令人困惑,但它是如何工作的:

代码语言:javascript
复制
#import <objc/runtime.h>    

@implementation UIImage(Debug)

// Executed once on startup, before anything at UIImage is called.
+ (void)load
{
    Class c = (id)self;

    // Use class_getInstanceMethod for "normal" methods
    Method m1 = class_getClassMethod(c, @selector(imageNamed:));
    Method m2 = class_getClassMethod(c, @selector(swizzle_imageNamed:));

    // Swap the two methods.
    method_exchangeImplementations(m1, m2);
}

+ (id)swizzle_imageNamed:(NSString *)name
{
    // Do your stuff here. By the time this is called, this method
    // is actually called "imageNamed:" and the original method
    // is now "swizzle_imageNamed:".

    doStuff();
    // Call original method
    id foo = [self swizzle_imageNamed:name];
    doMoreStuff();
    return something;
}

@end
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7599030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档