制作UIImage的副本

时间:2013-01-26 23:43:05

标签: iphone ios uiimage copy

我目前正在使用online tutorial上找到的代码让iPhone用户从相机胶卷中选择一张图片。将图像设置为UIImageView工作正常,但我尝试在图像上调用一个函数(每次移动一个滑块)。事实证明,操作系统没有保留在图像上,因此当我尝试访问它(或我制作的缓存变量)时,它不起作用(因为地址设置为0x0000000)。 / p>

如果UIImage符合NSCopying,这很简单。但是,事实并非如此。那么,如何复制图像以便操作系统不删除它呢?

可能重复

编辑: 更改滑块时,会调用此函数:

- (IBAction)samplingSliderChanged:(id)sender {
    NSLog(@"%@", self.imageStay);
    float sample = self.samplingSlider.value * 0.6 + 0.2;
    self.samplingRateText.text =  [NSString stringWithFormat:@"%.0f%%", sample*100];
    //self.imageView.image = [self.brain sampleImage:self.imageStay atRate:sample];
    self.imageView.image = [self.brain sampleImage:self.imageStay.copy atRate:sample];
    NSLog(@"self.imageStay: %@, self.imageStay.copy: %@", self.imageStay, self.imageStay.copy);
}

第一次移动滑块时,我的self.imageStay(缓存变量)的地址为0x0000

我的show-the-camera-roll功能如下:

-(void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    NSString *mediaType = info[UIImagePickerControllerMediaType];
    UIImage * image;

    [self dismissViewControllerAnimated:YES completion:nil];

    image = info[UIImagePickerControllerOriginalImage];
    image = [self imageWithImage:image scaledToSize:CGSizeMake(256, 256)];
    self.imageView.image = image;

    if (_newMedia)
        UIImageWriteToSavedPhotosAlbum(image,
                                       self,
                                       @selector(image:finishedSavingWithError:contextInfo:),
                                       nil);
    self.imageView.image = image;
    self.imageStay = image


}

在这里,缓存变量与image具有相同的内存地址,我的猜测是后来会被删除。

1 个答案:

答案 0 :(得分:2)

你不应该担心NSCopying,或者制作UIImage的副本,这不是你的问题。您正在丢失imageView中对图像的引用。操作系统 保留在图像上,否则它将从您的imageView中消失。我希望你没有正确引用它。也许你应该通过'缓存变量'来表明你的意思......

在任何情况下,获取当前显示在imageView中的图像的可靠方法是从imageView的图像属性获取它,如self.imageView.image

更新

如果self.imageView.image可能会被过滤,并且您还需要保留对原始图像的引用(例如,在self.imageStay中),则应将imageStay属性声明为

@property (nonatomic, strong) UIImage* imageStay;

如果您已正确完成此操作,并且仍然在self.imageStay中有一个nil引用,请在调试器中逐步执行代码以查看此处发生的情况:

   self.imageView.image = image;

    if (_newMedia)
        UIImageWriteToSavedPhotosAlbum(image,
                                   self,
                                   @selector(image:finishedSavingWithError:contextInfo:),
                                   nil);
    self.imageView.image = image;
    self.imageStay = image

self.imageStayself.imageView.image现在都应该引用同一个对象。顺便说一下,你在这里第二次分配self.imageView.image = image是多余的。

然后在- (IBAction)samplingSliderChanged:(id)sender中你会发现这些引用仍然存在。

如果您已将@property imageStay声明为弱引用,则可能会导致您的问题。它应该是strong以确保它持续存在。