によって提供された答え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