Objective c 使用UIImageView作为NSMutableDictionary中的键查找布尔值

Objective c 使用UIImageView作为NSMutableDictionary中的键查找布尔值,objective-c,uiimageview,nsdictionary,nsmutabledictionary,Objective C,Uiimageview,Nsdictionary,Nsmutabledictionary,标题几乎说明了一切。我想创建一个NSMutableDictionary,在这里我使用UIImageView查找布尔值。下面是它的样子: 我的.h文件: @interface ViewController : UIViewController{ UIImageView *image1; UIImageView *image2; NSMutableDictionary *isUseable; } @property (nonatomic, retain) IBOutlet

标题几乎说明了一切。我想创建一个NSMutableDictionary,在这里我使用UIImageView查找布尔值。下面是它的样子:

我的.h文件:

@interface ViewController : UIViewController{
    UIImageView *image1;
    UIImageView *image2;
    NSMutableDictionary *isUseable;
}

@property (nonatomic, retain) IBOutlet UIImageView *image1;
@property (nonatomic, retain) IBOutlet UIImageView *image2;
@property (nonatomic, retain) NSMutableDictionary *isUseable;
我的.m文件:

@synthesize image1, image2;
@synthesize isUseable

- (void)viewDidLoad
{
    isUseable = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                 @NO, image1,
                 @NO, image2,nil];
}

-(void)runEvents{
    if(some condition){
        [isUseable setObject:@YES forKey:(id)image1];
    }

    //Use it later:
    if(isUseable[image1]){
        //Do stuff
    }
}
它可以编译,但当我运行它时,会收到一个未捕获的异常“NSInvalidArgumentException”,原因:“-[UIImageView copyWithZone:]:未识别的选择器发送到实例


我猜问题在于NSDictionary类复制了它的键。有没有办法让字典在这种情况下工作?如果没有,我应该如何设置我想要的查找?有什么想法/建议吗?

是的,问题是NSDictionary中的密钥必须符合NSCopying协议,而UIImage则不符合

一个解决方案是给每个图像一个唯一的标签。然后将图像的标记包装成NSNumber后,将其用作密钥


只需添加代码即可查看每个图像的标记属性。

是的,问题是NSDictionary中的键必须符合NSCopying协议,而UIImage则不符合

一个解决方案是给每个图像一个唯一的标签。然后将图像的标记包装成NSNumber后,将其用作密钥

只需添加代码即可查看每个图像的标记属性。

NSDictionary中的键必须符合NSCopying,UIImageView则不符合。 您必须找到一个不同的键,或者可以扩展UIImageView以符合NSCopying。有关如何使用UIImage的信息,请参阅。

NSDictionary中的键必须符合NSCopying,而UIImageView则不符合。
您必须找到一个不同的键,或者可以扩展UIImageView以符合NSCopying。有关如何使用UIImage,请参阅。

rmaddy说得很对:NSDictionary必须符合NSCopying协议,而UIImage则不符合


我建议使用@image.hash作为字典键。这就像UIImage的指纹。

rmaddy说得很对:NSDictionary必须符合NSCopying协议,而UIImage则不符合


我建议使用@image.hash作为字典键。它就像UIImage的指纹。

从图像中获取原始数据,而不是重新渲染的PNG或JPG表示,然后通过内置的通用加密来获取数据的SHA256,这将是您的密钥

其他答案建议使用内置的instance属性.hash,但它很容易发生冲突,并且经常发生。我们在一个应用程序中遇到字符串冲突,导致了严重的错误

#include <CommonCrypto/CommonDigest.h>

-(NSString *)keyFromImage:(UIImage *)image {

    NSData *imageData = (__bridge NSData *)CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage));
    
    unsigned char result[CC_SHA256_DIGEST_LENGTH];
    CC_SHA256((__bridge const void *)imageData, (CC_LONG)imageData.length, result);
    
    NSMutableString *imageHash = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH*2];
    
    for(int i = 0; i<CC_SHA256_DIGEST_LENGTH; i++) {
        [imageHash appendFormat:@"%02x",result[i]];
    }
    
    return imageHash;

}

从图像中获取原始数据,而不是重新渲染的PNG或JPG表示,然后通过内置的通用加密来获取数据的SHA256,这将是您的密钥

其他答案建议使用内置的instance属性.hash,但它很容易发生冲突,并且经常发生。我们在一个应用程序中遇到字符串冲突,导致了严重的错误

#include <CommonCrypto/CommonDigest.h>

-(NSString *)keyFromImage:(UIImage *)image {

    NSData *imageData = (__bridge NSData *)CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage));
    
    unsigned char result[CC_SHA256_DIGEST_LENGTH];
    CC_SHA256((__bridge const void *)imageData, (CC_LONG)imageData.length, result);
    
    NSMutableString *imageHash = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH*2];
    
    for(int i = 0; i<CC_SHA256_DIGEST_LENGTH; i++) {
        [imageHash appendFormat:@"%02x",result[i]];
    }
    
    return imageHash;

}

根据对象的管理方式,您可以将其在内存中的地址用作键,这适用于UIImageView或UIImageView,因为关于此问题的一般性讨论似乎围绕着/或:


myDictionary[@intptr\u tmyObject]=myValue

根据对象的管理方式,您可以将其在内存中的地址用作键,这适用于UIImageView或UIImageView,因为关于此问题的一般性讨论似乎围绕着/或:


myDictionary[@intptr\u tmyObject]=myValue

使用散列作为密钥可能有效。请记住,两个图像可能具有相同的哈希值。虽然只有很少的图像,但是机会很小。应该注意的是。哈希冲突在Objective-c中相当常见。它们没有与处理SHA256之类的东西时使用的相同的抗碰撞能力。如果需要抗碰撞,可以获得UIImage的SHA256。我在这里给出了一个关于如何做到这一点的答案:使用散列作为键可能会起作用。请记住,两个图像可能具有相同的哈希值。虽然只有很少的图像,但是机会很小。应该注意的是。哈希冲突在Objective-c中相当常见。它们没有与处理SHA256之类的东西时使用的相同的抗碰撞能力。如果需要抗碰撞,可以获得UIImage的SHA256。我在这里给出了一个关于如何做到这一点的答案:谢谢,这很有帮助。有一段时间我很困惑,直到我意识到我必须设置自己的标签值,这是我的错,因为我没有认真阅读你的回复。我也有点喜欢下面的哈希建议,因为我不需要考虑自己的ID。谢谢,这很有帮助。有一段时间我很困惑,直到我意识到我必须设置自己的标签值,这是我的错,因为我没有认真阅读你的回复。我也有点喜欢下面的哈希建议,因为我不需要考虑自己的ID。我过去在d
正在将图像附加到NSMutableString。。。我使用指向NSTextAttachment的指针作为键,将原始HD源图像引用到NSTextAttachment中使用的缩略图,以便在点击时以文本形式显示LQ图像和HD图像。指针值不会更改,因为这一切都在一个UITextViews中。我过去在处理将图像附加到NSMutableString时使用过它。。。我使用指向NSTextAttachment的指针作为键,将原始HD源图像引用到NSTextAttachment中使用的缩略图,以便在点击时以文本形式显示LQ图像和HD图像。指针值不会更改,因为这一切都在一个UITextView中