Я довольно новичок в разработке для iphone, и я столкнулся со странным сбоем в моем приложении.Действительно, мое приложение всегда падает после того, как я имитировал предупреждение памяти.Я могу воспроизвести это поведение каждый раз, и мне удалось изолировать неисправную строку:).
Я работаю в пользовательском UITableViewController, поставляя пользовательские UITableViewCells.
@implementation CustomTableViewController
// [...]
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"MyTableViewCell";
UITableViewCell *cell = nil;
if ([indexPath row] < [dataList childCount])
{
cell = [tv dequeueReusableCellWithIdentifier:CellIdentifier];
if (nil == cell)
{
cell = [[[KpowUITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier] autorelease];
KUICustomView* customView = [[KUICustomView alloc]initWithFrame:CGRectZero];
[(KpowUITableViewCell*)cell setFrontView:customView];
[customView release];
}
KUICustomView* cView = [(KpowUITableViewCell*)cell frontView];
[cView setDataObject:[dataList getChildAtIndex:[indexPath row]]]; // The crash happens in this function
}
// [...]
Вот функция, в которой я устанавливаю пользовательский объект данных для своего представления ячейки:
-(void)setDataObject:(DataObject *)do
{
[do retain];
[dataObject release];
dataObject = do;
NSString* defaultPath = [NSString stringWithFormat:@"%@/default_image.png", [[NSBundle mainBundle] resourcePath]];
UIImage* defaultImage = [[UIImage alloc] initWithContentsOfFile:defaultPath];
[self setImage: defaultImage];//[UIImage imageNamed:@"default_image"]]; // The crash happens in this function
[defaultImage release];
// [...]
И, наконец, вот где происходит волшебство:
-(void)setImage:(UIImage *)img
{
[img retain];
NSLog(@"setImage : old image > %@/%@/%i", [image description], [[image class]description], [image retainCount]);
[image release]; // CRASH EXC_BAD_ACCESS
image = img;
[self setNeedsDisplay];
}
Итак, все нормально работает в обычном сценарии.Но если я имитирую предупреждение памяти, прокручиваю свой UITableView и все эти функции вызываются, приложение вылетает.Если я удаляю [релиз изображения], никакого сбоя (но «Hai там утечки памяти»).Вывод NSLog всегда выглядит примерно так:
setImage : old image > <UIImage: 0x4b54910>/UIImage/1
Я действительно не вижу, что я делаю неправильно или что я мог сделать, чтобыобойти эту проблему.Вот скриншот отладчика Xcode ...
http://img30.imageshack.us/i/debuggerscreen.png/
Любая помощь приветствуется.Заранее спасибо
Edit 1: @bbum Build and Analyze показал мне несколько не связанных предупреждений, но все же полезно.Даже не видел, что там было
Есть еще одно место, где я установил изображение.В setDataObject
изображение является просто заполнителем.Я запускаю загрузку реального изображения асинхронно и возвращаю его обратно в requestDidFinishLoad
.Метод выглядит следующим образом:
- (void)requestDidFinishLoad:(KURLRequest*)request
{
if (request == currentRequest)
{
UIImage* img = [[UIImage alloc] initWithData:[request data]];
if (nil != img)
[self setImage:img];
[img release];
}
if (currentRequest == request)
currentRequest = nil;
[request release];
}
Я запустил инструменты с NSZombie Detection, и результат, похоже, указывает в другом направлении.Вот скриншот:
http://img13.imageshack.us/i/zombieinstrument.jpg/
Я пока не совсем уверен, что с этим делать, но расследование продолжается:)