如何确保永远不会发布UIImage?

时间:2009-08-10 09:53:31

标签: iphone memory-management uiimageview uiimage

我从iPhone抓起了崩溃日志:

Exception Type:  EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x0000000c
Crashed Thread:  0

Thread 0 Crashed:
0   libobjc.A.dylib                 0x30011940 objc_msgSend + 20
1   CoreFoundation                  0x30235f1e CFRelease + 98
2   UIKit                           0x308f4974 -[UIImage dealloc] + 36
3   CoreFoundation                  0x30236b72 -[NSObject release] + 28
4   UIKit                           0x30a00298 FlushNamedImage + 64
5   CoreFoundation                  0x30250a20 CFDictionaryApplyFunction + 124
6   UIKit                           0x30a0019c _UISharedImageFlushAll + 196
7   UIKit                           0x30a00730 +[UIImage(UIImageInternal) _flushCacheOnMemoryWarning:] + 8
8   Foundation                      0x3054dc7a _nsnote_callback + 178
9   CoreFoundation                  0x3024ea52 _CFXNotificationPostNotification + 298
10  Foundation                      0x3054b854 -[NSNotificationCenter postNotificationName:object:userInfo:] + 64
11  Foundation                      0x3054dbba -[NSNotificationCenter postNotificationName:object:] + 14
12  UIKit                           0x30a00708 -[UIApplication _performMemoryWarning] + 60
13  UIKit                           0x30a006a0 -[UIApplication _receivedMemoryNotification] + 128
14  UIKit                           0x30a005d0 _memoryStatusChanged + 56
15  CoreFoundation                  0x30217410 __CFNotificationCenterDarwinCallBack + 20
16  CoreFoundation                  0x3020d0aa __CFMachPortPerform + 72
17  CoreFoundation                  0x30254a70 CFRunLoopRunSpecific + 2296
18  CoreFoundation                  0x30254164 CFRunLoopRunInMode + 44
19  GraphicsServices                0x3204529c GSEventRunModal + 188
20  UIKit                           0x308f0374 -[UIApplication _run] + 552
21  UIKit                           0x308eea8c UIApplicationMain + 960
...
...

从我之前的问题Can somebody give me a hand about this stacktrace in iPhone app?开始,我已经更改了我的代码主要围绕UIImage部分。我现在使用[[UIImage alloc] initWithContentsOfFile ...]。不再[UIImage imageNamed:...]等。部分在下面。

//this is a method of a subclass of UIImageView.
    - (void) reviewImage: (bool) review{
        NSString* st;
        if (review){
        NSString* origin = [NSString stringWithString: [[ReviewCardManager getInstance] getCardImageString:chosenIndex]];
        NSString* stt = [origin substringToIndex: [origin length]-4];

        st = [[NSString alloc] initWithString: stt];

        if (myImageFlipped == nil)
        myImageFlipped = [[UIImage alloc] initWithContentsOfFile: [[NSBundle mainBundle] pathForResource:st ofType:@"png"]];
        [self setImage:myImageFlipped];

        if (notRotated){
            self.transform = CGAffineTransformRotate(self.transform, [MyMath radf:rotate]);
            notRotated = false;
        }
    }else{
        st = [[NSString alloc] initWithFormat:@"sc%d", chosenNumber];

        if (myImage == nil)
        myImage = [[UIImage alloc] initWithContentsOfFile: [[NSBundle mainBundle] pathForResource:st ofType:@"png"]];

        [self setImage:myImage];

        if (notRotated){
            self.transform = CGAffineTransformRotate(self.transform, [MyMath radf:rotate]);
            notRotated = false;
        }

    }
    [st release];
}

我也已将UIImage保留在该属性中。

@property (nonatomic, retain) UIImage* myImage, *myImageFlipped;

内存泄漏也得到了关注。这些变量是以dealloc方法发布的。

我认为我已经成功杀死了这个bug,但似乎我仍然有一个罕见的错误问题。

根据崩溃日志,我的应用程序大喊“performMemoryWarning”。我只是“分配”了13个像素大小为156 x 272的图像。我很困惑。那些图像不应该占用太多内存,超过iPhone的RAM。或者有什么我在俯瞰?请指教。

2 个答案:

答案 0 :(得分:0)

为了帮助您解决内存问题和UIImages,您可能需要使用来自文档的UIImage的imageNamed convience方法:

This method looks in the system caches for an image object with the specified name and returns that object if it exists. If a matching image object is not already in the cache, this method loads the image data from the specified file, caches it, and then returns the resulting object.

或者,如果在切换到UIImage imageNamed后仍然遇到内存问题,您可能想要this route,因为使用这种方便性方法有一些缺点。

答案 1 :(得分:0)

问题解决了。我忘了在一个地方改变UIImage。现在,所有的UIImages都是真正的“分配”,不再是自动释放。

仅供参考,如果您使用的是[UIImage imageNamed:...],请在iPhone模拟器上使用“模拟内存警告”,以查看当真实设备内存不足时是否存在问题。