Проблемы с NSSavePanel - PullRequest
       33

Проблемы с NSSavePanel

0 голосов
/ 26 августа 2011

Я немного новичок в программировании какао, однако я довольно много работал на C ++;

У меня возникли некоторые проблемы с классом NSSavePanel.Всякий раз, когда я использую его (как показано ниже), я вижу (используя точки останова), что код пытается выполнить конечную скобку.Затем я получаю сообщение BAD_ACCESS из Xcode в файле main.h.Я не могу за свою жизнь понять, что я делаю неправильно.Вот код:

- (void)scannerDevice:(ICScannerDevice*)scanner didCompleteScanWithError:(NSError*)error;
{
    NSLog( @"scannerDevice: \n%@\ndidCompleteScanWithError: \n%@\n", scanner, error );
    [mProgressIndicator setHidden:YES];

    NSSavePanel *savePopup = [[NSSavePanel alloc]init];
    [savePopup runModal];

    NSMutableString *saveString = [[NSString alloc] init];
    saveString = [[savePopup URL] absoluteString];
    [saveString deleteCharactersInRange:NSMakeRange(0, 16)];
    [saveString appendString:@".jpeg"];

    NSLog(@"[[ADDRESS: %@", saveString); //Outputs /Users/tannerdsilva/Documents/TestFolder/NewName.jpeg
    NSError *errorSave = [[NSError alloc] init];

    [manager moveItemAtPath:[@"~/Foo.jpeg" stringByExpandingTildeInPath] toPath:[[savePopup URL] absoluteString] error:&errorSave]; // ~/Foo.jpeg does exist

    NSLog(@"ERROR: %@", errorSave);
    [saveString dealloc];
    [savePopup dealloc];

}

Когда я жестко кодирую новый пункт назначения и удаляю NSSavePanel, я не получаю никаких сбоев.

Заранее спасибо, и я извиняюсь, еслиэто простое исправление.

Ответы [ 2 ]

2 голосов
/ 26 августа 2011

Есть несколько проблем с вашим кодом.

  • Вы объявляете saveString как NSMutableString, но инициализируете его как (неизменяемый) NSString.
  • Тогда вы вообще не используете эту строку, а замените ее на автоматически освобожденную (и неизменяемую) NSString, возвращаемую из absoluteString, что приводит к утечке исходной строки.
  • NSString не отвечает ни на deleteCharactersInRange:, ни на appendString (это методы NSMutableString).
  • Вы пропускаете errorSave, который вы все равно должны инициализировать как nil.
  • Вы не должны никогда звонить dealloc самостоятельно, вместо этого используйте release. Но не выпускайте saveString, потому что он уже автоматически выпущен (см. Выше), вы переиздаваете его здесь, что вызовет сбой при сливе пула автоматического выпуска.
1 голос
/ 26 августа 2011

Хорошо, есть пара проблем с вашим кодом:


Подпись метода имеет конечную точку с запятой

(void)scannerDevice:(ICScannerDevice*)scanner didCompleteScanWithError:
    (NSError*)error;

РЕДАКТИРОВАТЬ : Per @omz и @Rudy Velthuis, конечная точка с запятой в сигнатуре метода реализации допускается Objective-C. Таким образом, вы можете игнорировать эту «проблему».


Вы должны использовать экземпляр класса для получения дескриптора для сохранения панели

NSSavePanel * savePanel = [NSSavePanel savePanel];

Вы должны проверить результат запуска панели сохранения модально

if ([savePanel runModal] == NSOKButton) {
    //...
}

* Вы создаете экземпляр NSString * и пропускаете его, совершенно не нужно *

NSMutable * saveString = [NSMutableString stringWithString: 
   [[savePopup URL] absoluteString]];

Как только вы исправите проблемы, описанные выше, вы захотите удалить две линии освобождения, поскольку объекты теперь будут автоматически освобождены. Обратите внимание, что обычно вы все равно хотите вызывать release в своем коде, а не dealloc .

...