编写自己的 iPad 相册 - 释放错误

Posted

技术标签:

【中文标题】编写自己的 iPad 相册 - 释放错误【英文标题】:Writing an own iPad photogallery - dealloc error 【发布时间】:2011-01-05 23:24:18 【问题描述】:

我想编写自己的相册,就像来自苹果的原始“Photos.app”一样。 我在 AppDelegate 中创建了一个 UITabbarcontroller,然后是“ImageViewController”和“VideoViewController”。

在“ImageViewController”中,我添加了一个 UIScrollView,然后创建了一个我自己的“PhotoGallery”实例,具有不同的属性,如 imagePerRow、图像、填充等。

对于“PhotoGallery”,我创建了一个新的objective-c 类作为“NSObject”的子类,我将所有不同的图像定位为UIButtons。 然后我添加了另一个函数,它描述了设备方向发生变化时所有图像的排列。和dealloc函数。就是这样。

这个类很好用,当设备方向改变时也能重新排列。问题是,如果我在 ios-simulator 中模拟内存警告,PhotoGallery 第一次正确释放,但如果我再次模拟警告,我会收到错误消息:“[PhotoGallery release]: message sent to deallocated instance ”。

我认为是因为子类是 NSObject,对吧? 然后我将它作为 UIView 进行了测试。有同样的错误。所以知道我不知道该做什么了。希望你明白什么是问题,你会给我一些提示。 考虑再次调用 init 函数吗?如何?需要“drawRect”吗?我不知道。

感谢您的时间和帮助, G.

【问题讨论】:

这不能回答您的问题(因此,将其添加为评论)但您是否考虑过使用three20?他们很好地实现了大多数照片应用程序的内容。 是的。谢谢您的回复。我想学习如何自己写这些东西。我看了一下three20的源码,但是现在对我来说太难了,所以我决定一步一步地学习它.. 【参考方案1】:

您可能没有将保存对 PhotoGallery 的引用的属性设置为 nil。

即。您保留对已释放实例的引用,并尝试对其调用 release

不好的例子:

- (void) didReceiveMemoryWarning

    [photoGallery release];

安全(r)示例:

- (void) didReceiveMemoryWarning

    [photoGallery release];
    photoGallery = nil;

    // or combine both actions if your property attributes are set up to accommodate it:
    // self.photoGallery = nil;

在坏的例子中,photoGallery 仍然持有对一个现已释放的实例的引用,并且第二个内存警告将尝试向它发送消息。

在 safe(r) 示例中,photoGallery 为 nil,向 nil 发送消息是安全的。

【讨论】:

耶耶!伟大的!这么容易修?!好的!我认为我的 ViewController 或 NSObject 的子类必须修复。但确切地说,我没有将 photoGallery 设置为 nil! 但又是一个问题:PhotoGallery 类是否必须是 NSObject 或 UIView 的子类?两者的优势是什么? 内存管理方法在 NSObject 上声明。 UIView 的子类化可以让您获得 View 的所有内置功能。当出现关于继承的问题时,请询问“我的类是 吗?”如果是,则从它继承。

以上是关于编写自己的 iPad 相册 - 释放错误的主要内容,如果未能解决你的问题,请参考以下文章

UIPopoverController 中的 iPad UIImagePicker 仅选择保存的图像(不是来自相册)?

从照片库/相册中获取图像在 ipad 上不起作用

求一个可以linux虚拟机下可用的纯C语言编写的电子相册,有浏览,预览图片和背景音乐功能

iOS保存图片到相册崩溃

指针指向空间的申请和释放易错点

iOS开发之保存照片到自己创建的相簿