views:

1431

answers:

2

I grabbed the crash log from the 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
...
...

From my previous question, http://stackoverflow.com/questions/1248810/can-somebody-give-me-a-hand-about-this-stacktrace-in-iphone-app, I have changed my codes mainly around UIImage part. I now use [[UIImage alloc] initWithContentsOfFile ... ]. No more [UIImage imageNamed: ... ] or the like. The portion is below.

//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];
}

I also have the UIImage already retained in the property.

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

Memory Leaks have also been taken cared of. These variables are release in dealloc method.

I thought that I have successfully killed the bug, but it seems that I still have a rare occuring bug problem.

Based on the crash log, my application yells out "performMemoryWarning". I am just "alloc"-ing 13 .png images with the size 156 x 272. I'm confused. Those images shouldn't take that much memory to the point that it exceeds iPhone's RAM. Or is there something I am overlooking? Please advise.

A: 

To help you with memory issues and UIImages, you might want to use the imageNamed convience method of UIImage, from the docs:

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.

Alternatively, you might want to go this route if you still run into memory issues after switching to UIImage imageNamed, because there are some downsides to using the convinience method.

WardB
No, the poster already mentioned they had moved *away* from imageNamed, which would be what I would have recommended in order to address those memory warnings, as imageNamed's cache is outwith the programmer's control.
hatfinch
Ah, i read over that section. In that case, a custom cache like in the linked blog post would then make more sense.
WardB
A: 

The problem is solved. I forgot to change UIImage at one place. Now, all UIImages are truly "alloc", no more autorelease.

FYI, if you are using [UIImage imageNamed: ... ], use "Simulate Memory Warning" on iPhone Simulator to see whether you are having a problem with it when the real device is low on memory.

unknownthreat