Задача C проблема управления памятью - PullRequest
0 голосов
/ 07 октября 2011

У меня возникла эта проблема с некоторым объективным кодом C для загрузки изображений в IKImageBrowserView. Я слежу за примером браузера изображений от Apple, но в какой-то момент все равно не удается, и я угадываю его управление памятью. Вот часть кода:

/* Our datasource object */
@interface myImageObject : NSObject
{
    NSString *_path; 
}
@end
@implementation myImageObject

- (void)dealloc
{
    [_path release];
    [super dealloc];
}

/* our datasource object is just a filepath representation */
- (void)setPath:(NSString *)path
{
    NSLog(@"setting path for %@",path);
    if(_path != path)
    {
     [_path release];
        _path = [path retain];
    }
}

Теперь, похоже, я правильно сохраняю значение пути внутри объекта. Теперь к коду контроллера:

-(IBAction)loadMosaicImages:(id)sender
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSArray *urls = [openFiles() retain];
NSInteger n;
n = [urls count];

NSURL *url = [urls objectAtIndex:0];
[self parsePathForImages:[url path]];
[urls release];
[pool drain];
}
- (void)updateDatasource
{
    NSLog(@" UDS-> _importedImages length  : %@",[_importedImages count]);
    //-- update our datasource, add recently imported items    
    [_images addObjectsFromArray:_importedImages];

    //-- empty our temporary array
    [_importedImages removeAllObjects];
    NSLog(@" UDS-> _images length  : %@",[_images count]);
    //-- reload the image browser and set needs display
    [_imageBrowser reloadData];
}
-(void)parsePathForImages:(NSString *)path{

    NSLog(@"Directory within thread method is %@",path);
    NSArray *content = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:nil];
    myImageObject *p;
    for(int i=0;i<content.count;i++)
    {
       // NSLog(@"%@",(NSString *)[content objectAtIndex:i]);
        NSLog(@"Complete : %@",[path stringByAppendingPathComponent:(NSString *)[content objectAtIndex:i]]);
        /* add a path to our temporary array */
        p = [[myImageObject alloc] init];
        [p setPath:[path stringByAppendingPathComponent:[content objectAtIndex:i]]];
        [_importedImages addObject:p];
        [p release];
    }
    [self updateDatasource];
}

и это все соответствующий код. _images и _importedImages - это NSMutableArrays, выделенные и инициированные в методе пробуждения от nib, а openFiles () - статический метод, который открывает NSOpenpanel и возвращает NSArray путей.

вывод отладки для этого делает это:

Directory within thread method is /Users/cromestant/Code/images/
Complete : /Users/cromestant/Code/images/1.jpg
setting path for /Users/cromestant/Code/images/1.jpg
Complete : /Users/cromestant/Code/images/2.jpg
setting path for /Users/cromestant/Code/images/2.jpg
Complete : /Users/cromestant/Code/images/3.jpg
setting path for /Users/cromestant/Code/images/3.jpg

. , , затем останавливает сбои в первой строке метода updateDataSource, в NSLog с 'EXEC_BAD_ACCESS', где я ошибаюсь с управлением памятью? Кажется, я создаю autoreleasePool, так что у меня есть время, чтобы сохранить его где-то еще, я освобождаю свои объекты ... У меня действительно нет понятия, где может быть проблема. заранее спасибо.

1 Ответ

2 голосов
/ 07 октября 2011

На самом деле, я думаю, что ваша проблема не в управлении памятью.Это может быть здесь:

NSLog(@" UDS-> _importedImages length  : %@",[_importedImages count]);

Это должно быть

NSLog(@" UDS-> _importedImages length  : %d",[_importedImages count]);

, потому что метод count возвращает целое число, а не объект.

...