ios - 编写自己的 iPad 照片库 - 释放错误

标签 ios uiviewcontroller nsobject photo-gallery

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

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

对于“PhotoGallery”,我创建了一个新的 Objective-C 类作为“NSObject”的子类,其中我将所有不同的图像定位为 UIButton。 然后我添加了另一个函数,它描述了设备方向更改时所有图像的排列。以及 dealloc 函数。仅此而已。

这个类效果很好,当设备方向改变时也可以重新排列。问题是,如果我在 ios 模拟器中模拟内存警告,第一次 PhotoGallery 会正确释放,但如果我再次模拟警告,我会收到一条错误消息:“[PhotoGallery release]:消息发送到释放实例”。

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

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

最佳答案

您可能没有将保存对 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 发送消息是安全的。

关于ios - 编写自己的 iPad 照片库 - 释放错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4610282/

相关文章:

objective-c - -forwardInvocation 用于类方法

ios - 对象的属性未在其他对象中显示

ios - 访问 IOS 数组和字典中包含的值

iphone - UIViewController -dealloc 在关闭模态视图 Controller 后被调用

ios - 如何在 Swift 中获取 UIScrollView 垂直方向?

ios - 缺少依赖目标 "CordovaLib (from CordovaLib.xcodeproj)"

ios - arc4random_uniform()和arm64的不同行为

swift - 标签栏 Controller 不会在 Swift 中显示标签栏项目

ios - 如何在 Swift 2.0 中实现 copyWithZone?

objective-c - UITapGestureRecognizer选择器,sender是手势,不是ui对象