【问题标题】:Saving UIImage files with NSCoding by converting them to NSData通过将 UIImage 文件转换为 NSData 来保存使用 NSCoding 的 UIImage 文件
【发布时间】:2011-09-14 16:55:14
【问题描述】:

我正在尝试在我自己的 NSCoding 符合类中保存来自 ABRecordRef 的 UIImage。据我现在所知,UIImage 不符合NSCoding,因此我尝试使用NSData 代替以下解决方法:

- (id)initWithRecordRef:(ABRecordRef)record{
    //Getting the image
    if (ABPersonHasImageData(record)){
        CFDataRef imageData = ABPersonCopyImageData(record);
        image = [UIImage imageWithData:(NSData *) imageData];
        CFRelease(imageData);
    }


    return self;
}

     - (void)encodeWithCoder:(NSCoder *)aCoder{
            //encode NSData representation from UIImage
            tempData = UIImagePNGRepresentation(image);
            [aCoder encodeObject:tempData forKey:@"image"];
        }

    - (id)initWithCoder:(NSCoder *)aDecoder{
        //image
        tempData =          [aDecoder decodeObjectForKey:@"image"];
        image=              [UIImage imageWithData:[tempData valueForKey:@"image"]];
        [tempData release];

        return self;
    }

由于某种原因,当我尝试保存此类的实例时,程序会立即崩溃。 我做错了什么,或者做得更好:我怎样才能完成我想要的?谢谢!

【问题讨论】:

    标签: iphone uiimage nsdata nscoding


    【解决方案1】:

    我认为问题可能是您在解码器中调用[tempData release]。据我所知,分配没有保留计数,因此它释放了一个不应该释放的对象。如果这不起作用,我会在每个方法中设置几个日志语句,以查看在崩溃发生之前调用了哪些语句。这将使我们更好地了解应该关注的地方

    【讨论】:

    • 首先,没有必要发布,所以你可以这样做。不幸的是,这并没有解决问题。我又试了几次,似乎错误就在这个语句中:image= [UIImage imageWithData:[tempData valueForKey:@"image"]]; 当我查看它时,我明白了,valueForKey 部分是不必要的。这部分现在可以工作了,但是如果我尝试将加载的数据中的图像分配给图像视图,现在我得到了 sigarbit ... NSCoding 中的图像保存甚至像这样工作吗?我做错了什么?
    • 很高兴您发现了valueForKey: 部分。不幸的是,我跳过了那个。您如何将图像分配给 imageView?这纯粹是一种猜测,但听起来图像在您将其分配给 imageView 之前已被释放。
    • 首先我加载了我的类RealRecord 的保存实例,然后我将图像分配给一个名为avatarViewUIImageview,如下所示:-(IBAction)loadSavedContact{ RealRecord *myRecord = [NSKeyedUnarchiver unarchiveObjectWithFile:[self saveFilePath]]; if (myRecord == nil){ NSLog(@"loading failed"); } avatarView.image=myRecord.image; // SIGARBIT happens here } 对不起非结构化代码;不知道如何在评论中做得更好。
    • 不不,这完全没问题。在这一点上,看起来我们将不得不使用一些日志来获取根目录。首先,“加载失败”日志是否会被触发?我只是问,因为看起来代码无论如何都会继续,所以如果有一个 nil 记录,它仍然会尝试分配一个图像。无论哪种方式,最好将以下日志放在avatarView.image=... 之前。 NSLog(@"myRecord = %@", myRecord");NSLog(@"avatarView = %@", avatarView");NSLog(@"image = %@", myRecord.image");。这应该有助于缩小问题范围。
    • 好吧,if 语句只是快速尝试找出加载是否有效。将添加 else 语句。我确实添加了日志,现在看来很清楚,问题在于图像而不是分配,因为它说:2011-09-16 17:39:00.736 test2[2883:207] myRecord = <RealRecord: 0x5946790> 2011-09-16 17:39:00.738 test2[2883:207] avatarView = <UIImageView: 0x5936a60; frame = (112 0; 96 124); autoresize = RM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x5936b30>> 并且我已经在NSLog(@"image = %@", myRecord.image"); 语句中获得了 SIGARBIT。
    猜你喜欢
    • 1970-01-01
    • 2011-09-22
    • 2013-11-29
    • 1970-01-01
    • 2010-12-21
    • 2015-11-24
    • 1970-01-01
    • 2015-06-13
    相关资源
    最近更新 更多