gpt4 book ai didi

objective-c - UIImage setter NSInvalidArgumentException

转载 作者:行者123 更新时间:2023-12-03 17:59:44 25 4
gpt4 key购买 nike

类中的对象 setter 存在问题。我有 GEOImage 类,其中描述、标题等内容将根据到图像。

@interface GEOImage : UIImage
{
NSString *title;
NSString *imgDescription;
NSString *latitude;
NSString *longitude;
NSDictionary *editInfo;
}
@property (nonatomic, copy) NSString *title, *imgDescription, *latitude, *longitude;
@property (nonatomic, copy) NSDictionary *editInfo;
@end

现在我尝试存储另一个类的描述:

self.chosenImage.imgDescription = @"description";

其中 selectedImage 的类型为 GEOImage。

但我收到错误:

-[UIImage setTitle:]: unrecognized selector sent to instance 0x939d220 2011-12-05 10:59:40.621 GeoPG[511:17c03] * Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIImage setTitle:]: unrecognized selector sent to instance 0x939d220'

如果我在调试器中查看,则 selectedImage 不为 NULL,并且它在 ImageView 中显示正确。

问候s4l鱼

最佳答案

我们可以安全地推断出chosenImage不是nil;如果它是nil,那么向它发送消息将不会执行任何操作,也不会崩溃。

(另外,我假设您在使用示例中指的是 title 而不是 imgDescription,或者您实现了 setImgDescription:依次设置标题。)

有两种可能性:

死亡对象

您创建了作为 GEOImage 存储到 chosenImage 的图像,但是当您保留它时它就消失了。随后,在同一地址创建了一个 UIImage(如异常消息中所示),因此您现在仍然持有的指针指向 UIImage。您向它发送了一条仅适用于 GEOImage 的消息,但它只是一个 UIImage,因此它不会响应该消息,这是异常(exception)。

当你持有一个对象时,它死亡的原因是你没有将它保留在你应该保留的地方,或者你将它释放到你不应该保留的地方。或者可能两者兼而有之。

使用 Zombies 模板在 Instruments 下运行您的应用程序。当您遇到此崩溃时,它会升起一个标志,然后您可以通过单击该标志中的按钮进行调查。从末尾开始查看所有的 Release 和 Autorelease 事件,找到不应该出现的事件;然后,如果释放本身是无根据的,请将其取出,或者如果它应该由先前的保留来平衡,则将其中之一放入。

崩溃的一个可能原因是您将 chosenImage 属性声明为 assign,但您应该将其声明为 retain/。如果这是问题所在,您的 Instruments 调查结果将支持它。

从长远来看,您应该转换为 ARC,这可以消除 90% 可能发生此问题的情况。

您一开始就没有创建过 GEOImage

仅仅因为您声明 chosenImage 将保存指向 GEOImage 的指针并不意味着它确实如此。您可以在那里分配任何对象指针,并且在许多情况下,编译器不知道它实际上是否不是 GEOImage。

(他们在 Clang 的 future 版本中引入了一项名为“相关结果类型”的功能,这应该会大大降低这种情况的可能性。)

据猜测,我会说你正在做这样的事情:

self.chosenImage = [GEOImage imageNamed:@"blah blah blah"];

或者这个:

self.chosenImage = [imagePicker takePicture];

没有理由期望 takePicture 返回 GEOImage(它怎么知道这就是你想要的?),并且很可能 +[UIImage imageNamed:] (假设您只是继承它)也不会。除非您自己使用 alloc 和初始化器创建 GEOImage 实例,否则您不能假设您获得的任何 UIImage 都是 GEOImage。

解决方案是轻松地从 UIImage 创建 GEOImage(这将涉及包装 this method ),然后执行此操作。

<小时/>

一旦您的 chosenImage 属性中有一个事件的(不是死的)GEOImage(不是 UIImage),它就可以工作。

关于objective-c - UIImage setter NSInvalidArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8383680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com