Как сделать так, чтобы UIImage никогда не выпускался? - PullRequest
0 голосов
/ 10 августа 2009

Я взял журнал сбоя с 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
...
...

Из моего предыдущего вопроса, Может кто-нибудь помочь мне с этой трассировкой стека в приложении для iPhone? , я изменил свои коды в основном вокруг части 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.

Я думал, что успешно уничтожил ошибку, но, похоже, у меня все еще есть редкая проблема с ошибкой.

На основании журнала сбоев мое приложение выкрикивает "executeMemoryWarning". Я просто "размещаю" 13 изображений PNG размером 156 x 272. Я в замешательстве. Эти изображения не должны занимать столько памяти, сколько они превышают оперативную память iPhone. Или я что-то пропускаю? Пожалуйста, сообщите.

Ответы [ 2 ]

0 голосов
/ 11 августа 2009

Проблема решена. Я забыл изменить UIImage в одном месте. Теперь все UIImages действительно "alloc", больше нет автоматического выпуска.

К вашему сведению, если вы используете [UIImage imageNamed: ...], используйте «Имитация предупреждения о памяти» на iPhone Simulator, чтобы увидеть, есть ли у вас проблемы с ним, когда на реальном устройстве недостаточно памяти.

0 голосов
/ 10 августа 2009

Чтобы помочь вам с проблемами с памятью и UIImages, вы можете использовать метод UImage 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, потому что есть некоторые недостатки использования метода удобства.

...