H2C03提供的答案是合适的。使用字典来关联名称。
但是,另一种方法是使用关联对象。请注意,使用关联对象在空间和时间上都有成本,但它们仅适用于这种情况(添加类别属性)。
@interface UIImage (MyImageLabel)
@property (nonatomic, copy) NSString *label;
@end
#import <objc/runtime.h>
@implementation UIImage (MyImageLabel)
static char const kImageLabelKey[1];
- (NSString*)label {
return objc_getAssociatedObject(self, kImageLabelKey);
}
- (void)setLabel:(NSString *)label {
objc_setAssociatedObject(self, kImageLabelKey, label, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
@end
现在,您可以在 UIImage 实例上拥有一个 label 属性,如下所示:
myImage.label = someLabelStringCouldEvenBeFilename;
和
if ([myImage.label isEqualToString:someString]) {
}
典型的警告适用于类别中的任何内容。大多数人会鼓励您使用唯一的前缀或后缀来区分您的类别方法与未来潜在的 Apple 名称。
请注意,您可以向类别添加其他方法,如下所示...
+ (UIImage)myImageNamed:(NSString*)name {
id result = [self imageNamed:name];
[result setLabel:name];
return result;
}
现在你会自动设置标签。
当然,如果您将始终创建自己的图像,并且避免与关联对象相关联的“肮脏”(尽管您的所有图像都需要是 MyUIImages),那么您可以将其作为子类来执行。
@interface MyUIImage : UIImage
@property (nonatomic, copy) NSString *label;
@end
@implementation MyUIImage
// Now, you override imageNamed:
+ (UIImage*)imageNamed:(NSString*)name {
UIImage *image = [super imageNamed:name];
self.label = name;
return image;
}
@end