2010-05-05 2 views
0

Обновление: я не мог найти причину проблемы, с которой я использовал бета-версию SDK, и при использовании окончательного SDK проблема исчезла. Я не знаю, что я сделал неправильно. Сожалею. Я хотел удалить это, но не смог.указатель освобождения не был назначен

Здравствуйте у меня есть следующее сообщение об ошибке:

таНос: * ошибка для объекта 0x2087000: указатель освобождения не было выделено * установить контрольную точку в malloc_error_break для отладки

Я понятия не имею, что объект, который есть. Я не знаю, как его найти. Может ли кто-нибудь объяснить мне, как (и где) использовать malloc_history. Я установил точку останова в malloc_error_break, но я не смог узнать, какой объект находится на этом адресе. Я получаю это после удаления объекта из nsmutablearray и нажатия контроллера вида вручную. Если я прокомментирую строку [reviewUpload.images removeObject: self.reviewUploadImg], это не дает мне ошибку, но, конечно, для меня это не полезно.

 
- (void) removeImage 
{ 
    debugLog(@"reviewUploadImg %@", self.reviewUploadImg); 
    debugLog(@"reviewUpload %@", self.reviewUpload); 
    debugLog(@"reviewUploadImg thumb %@", self.reviewUploadImg.thumb); 
    [reviewUpload.images removeObject: self.reviewUploadImg]; 
    [self.navigationController popViewControllerAnimated:TRUE]; 
} 

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

Я добавляю изображение из UIImagePickerController.

 
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 

    UIImage *pickedImage = (UIImage *)[info objectForKey: UIImagePickerControllerEditedImage]; 
    if (!pickedImage) 
     pickedImage = (UIImage *)[info objectForKey: UIImagePickerControllerOriginalImage]; 

    if (!reviewUpload.images) 
     reviewUpload.images = [[NSMutableArray alloc] initWithCapacity: 5]; 

    //UIImage *thumbImage = [pickedImage copyResizedImage: CGSizeMake(120, 120)]; 
    UIImage *thumbImage = [pickedImage copyResizedImage:CGSizeMake(120, 120) withPaddingColor: [UIColor lightGrayColor]]; 

    ReviewUploadImage *rui = [[ReviewUploadImage alloc] init]; 
    rui.thumb = thumbImage; 
    [thumbImage release]; 

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat: @"yyyyMMddHHmmssSS"]; 

    NSDate *date = [NSDate date]; 
    NSString *tmpFileName = [dateFormatter stringFromDate: date]; 

    [dateFormatter release]; 

    NSString *path = [NSTemporaryDirectory() stringByAppendingPathComponent: tmpFileName]; 

    NSData *imageData = [[NSData alloc] initWithData: UIImageJPEGRepresentation(pickedImage, 0.90)]; 
    [imageData writeToFile: path atomically: TRUE]; 
    [imageData release]; 

    rui.path = path; 
    [reviewUpload.images addObject: rui]; 
    debugLog(@"rui rc %i", rui.retainCount); 
    [rui release]; 

    [self dismissModalViewControllerAnimated:TRUE]; 
} 

Я не думаю, что у меня есть что-то здесь не так: ReviewUpload имеет множество изображений, которые могут содержать объекты ReviewUploadImage. В реализации этих классов у меня есть только метод release, я просто освобождаю членов, которые я должен выпустить.

 
@interface ReviewUpload : NSObject 
{ 
    NSString  *title; 
    NSString  *tags; 
    NSString  *text; 
    NSInteger  rating; 
    NSMutableArray *images; 

    NSInteger  idCompany; 
    NSInteger  idProduct; 

} 

@property(nonatomic, copy)  NSString *title; 
@property(nonatomic, copy)  NSString *tags; 
@property(nonatomic, copy)  NSString *text; 
@property(nonatomic, assign) NSInteger rating; 
@property(nonatomic, retain) NSMutableArray *images; 

@property(nonatomic, assign) NSInteger idCompany; 
@property(nonatomic, assign) NSInteger idProduct; 

@end 
 
@interface ReviewUploadImage : NSObject 
{ 
    UIImage *thumb; 
    NSString *path; 
} 

@property(nonatomic, retain) UIImage *thumb; 
@property(nonatomic, copy)  NSString *path; 

@end 

там не простой способ получить Objective-C объект из адреса ?!

UPDATE: Если я удалю одну из этих строк, я не получу ошибку. Я не знаю, что сказать, что это действительно странно.

 
    [reviewUpload.images removeObject: self.reviewUploadImg]; 
    [self.navigationController popViewControllerAnimated:TRUE]; 

UPDATE: если изображение выбрано в «didFinishPickingMediaWithInfo» отсутствует не отображается ошибка. Возможно, он должен что-то сделать с тем, как я создаю миниатюру. Вот метод, который его создает. Если у кого-нибудь есть идея, пожалуйста, помогите.

 
-(UIImage *) copyResizedImage:(CGSize) thumbSize withPaddingColor: (UIColor *) bgColor 
{ 
    CGFloat resizedProp = thumbSize.width/thumbSize.height; 
    CGFloat imageProp = self.size.width/self.size.height; 

    CGSize newSize; 
    CGFloat factor; 

    if (imageProp > resizedProp) //image is wider 
     factor = thumbSize.width/self.size.width; 
    else 
     factor = thumbSize.height/self.size.height; 

    newSize.width = self.size.width * factor; 
    newSize.height = self.size.height * factor; 

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    UIImage *resizedImage; 

    UIGraphicsBeginImageContext(thumbSize); 
    CGContextRef drwContextRef = UIGraphicsGetCurrentContext(); 
    CGContextSetFillColorWithColor(drwContextRef, bgColor.CGColor); 
    CGContextFillRect(drwContextRef, CGRectMake(0, 0, thumbSize.width, thumbSize.height)); 
    CGRect imageRect = CGRectMake(
     (thumbSize.width - newSize.width)/2.0, 
     (thumbSize.height - newSize.height) /2.0, newSize.width, newSize.height); 
    [self drawInRect:imageRect]; 
    resizedImage = UIGraphicsGetImageFromCurrentImageContext(); // this is autoreleased and i dont need it 
    UIGraphicsEndImageContext(); 

    [resizedImage retain]; 
    [pool release]; 
    return resizedImage; 
} 
+0

Можете ли вы поместить код, где вы инициализируете reviewUploadImg? и что такое reviewUpload? что это за объект? Это поможет лучше понять вашу проблему. –

+0

reviewUploadImg - класс ReviewUploadImage для хранения изображения обзора для обзора (класс ReviewUpload). Пользователь может писать обзоры для компании или продукта и может прикреплять изображения к обзору, которые хранятся в reviewUpload.images. –

+0

Почему этот вопрос так популярен? –

ответ

4

Когда объект удален из массива, он отправляет сообщение dealloc. Взгляните на свою функцию dealloc класса ReviewUploadImage. Я вижу, что у тебя есть большой член. Проверьте, сохраняете ли вы его где-нибудь. В любом случае, если ваше приложение останавливается на точке останова вы установили, вы можете использовать следующие команды GDB, чтобы увидеть стек:

backtrace -- Print backtrace of all stack frames 
bt -- Print backtrace of all stack frames 
down -- Select and print stack frame called by this one 
frame -- Select and print a stack frame 
return -- Make selected stack frame return to its caller 
select-frame -- Select a stack frame without printing anything 
up -- Select and print stack frame that called this one 

надеюсь, что это помогает.

EDIT: Я видел ваш код, я думаю, вы должны сохранить thumbImage, прежде чем назначать его указателю на элемент или использовать setter, setter сделает это за вас автоматически.

+0

Спасибо, я попробую эти команды. Странно то, что это не адрес reviewUpload или текущий reviewUploadImg или большой палец от reviewUploadImg. Я знаю это, потому что я регистрирую эти адреса в revomeImage непосредственно перед ошибкой. но ни один из них не является «правильным», но мне кажется странным, что все, что я могу сделать, это угадать объект по адресу. –

+0

thumbImage - это вновь созданное изображение. Я написал функцию copyResizedImage. Когда я передаю thumbImage для просмотраUploadImg, он сохраняется из-за @property (неатомный, сохраняющий) UIImage * thumb. И в ошибке это не адрес thumbImage. –

+0

в функции removeImage попытайтесь зарегистрировать себя также. –

0

Я сделал malloc_history, но я действительно не понимаю эти результаты. Показывает ли это все allocs и deallocs для этого адреса? Они должны соответствовать? (потому что они этого не делают, линия ALLOC больше). Распределяет и отменяет?Извините за то, что вы задали этот вопрос и задали вопросы в ответе.

Боковой вопрос: Почему программа не замерзает? У меня были подобные случаи с выпуском памяти, и они закончились в EXC_BAD_ACCESS или что-то подобное.

 
TestWebService(740,0xa067b4e0) malloc: *** error for object 0x20e5000: pointer being freed was not allocated 
*** set a breakpoint in malloc_error_break to debug 
(gdb) shell malloc_history 207 0x20e5000 
malloc_history cannot examine process 207 because the process does not exist. 
(gdb) shell malloc_history 740 0x20e5000 
malloc_history Report Version: 2.0 
Process:   TestWebService [740] 
Path:   /Users/kudorgyozo/Library/Application Support/iPhone Simulator/3.0/Applications/6AF403F5-6856-44B9-A76E-45F58355535A/TestWebService.app/TestWebService 
Load Address: 0x1000 
Identifier:  TestWebService 
Version:   ??? (???) 
Code Type:  X86 (Native) 
Parent Process: gdb-i386-apple-darwin [742] 

Date/Time:  2010-05-06 12:02:23.167 +0300 
OS Version:  Mac OS X 10.6.3 (10D573) 
Report Version: 6 

ALLOC 0x20e3800-0x20e512f [size=6448]: thread_a067b4e0 |start | main | UIApplicationMain | GSEventRun | GSEventRunModal | CFRunLoopRunInMode | CFRunLoopRunSpecific | __NSFireDelayedPerform | -[UITableView _userSelectRowAtIndexPath:] | -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] | -[PLAlbumView tableView:didSelectRowAtIndexPath:] | -[PLUIAlbumViewController albumView:selectedPhoto:] | PLNotifyImagePickerOfImageAvailability | -[UIImagePickerController _imagePickerDidCompleteWithInfo:] | -[WriteReviewImagesController imagePickerController:didFinishPickingMediaWithInfo:] | -[UIImage(Thumbnails) copyResizedImage:withPaddingColor:] | -[UIImage drawInRect:] | -[UIImage drawInRect:blendMode:alpha:] | CGContextDrawImage | ripc_DrawImage | ripc_AcquireImage | CGSImageDataLock | img_data_lock | img_interpolate_read | img_decode_read | CGAccessSessionGetChunks | getBytes_cb | getBandProcJPG | _cg_jpeg_start_decompress | _cg_jinit_master_decompress | start_input_pass | start_pass_huff_decoder | _cg_jpeg_make_d_derived_tbl | alloc_small | malloc | malloc_zone_malloc 
---- 
FREE 0x20e3800-0x20e512f [size=6448]: thread_a067b4e0 |start | main | UIApplicationMain | GSEventRun | GSEventRunModal | CFRunLoopRunInMode | CFRunLoopRunSpecific | __NSFireDelayedPerform | -[UITableView _userSelectRowAtIndexPath:] | -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] | -[PLAlbumView tableView:didSelectRowAtIndexPath:] | -[PLUIAlbumViewController albumView:selectedPhoto:] | PLNotifyImagePickerOfImageAvailability | -[UIImagePickerController _imagePickerDidCompleteWithInfo:] | -[WriteReviewImagesController imagePickerController:didFinishPickingMediaWithInfo:] | -[UIImage(Thumbnails) copyResizedImage:withPaddingColor:] | -[UIImage drawInRect:] | -[UIImage drawInRect:blendMode:alpha:] | CGContextDrawImage | ripc_DrawImage | ripc_AcquireImage | CGSImageDataLock | img_data_lock | img_interpolate_read | img_decode_read | CGAccessSessionGetChunks | getBytes_cb | getBandProcJPG | _cg_jpeg_destroy | self_destruct | free_pool | free 


-1

Через один месяц я магическим образом решить эту ошибку путем удаления iPhone OS 4 бета SDK и установка 3.2 SDK. Это больше не дает мне ошибку.

+0

как к черту это ответ помогает кому-то ??? –

+0

Извините, я не отмечил это как принято. Я не знал, в чем была проблема. –

+0

. Интересно, была ли ошибка в бета-версии sdk? –

Смежные вопросы