2012-03-17 3 views
0

Поэтому мне нужно добавить объекты из NSArray, которые пользователь выбрал с помощью NSOpenPanel, и поместить все имена файлов в этот массив. Тогда у меня есть NSMutableArray, называемые аргументами, которые я ставил аргументы программным путем. Затем мне нужно добавить эти объекты из NSArray в конец этого NSMutableArray. Поэтому я использую [NSMutableArray addObjectsFromArray:NSArray], и это все время дает мне ошибку.Как добавить объекты из NSArray в конец NSMutableArray?

Это то, что я делаю с кодом: AppDelegate.h

#import <Cocoa/Cocoa.h> 

@interface ZipLockAppDelegate : NSObject <NSApplicationDelegate> { 
    IBOutlet NSTextField *input; 
    IBOutlet NSTextField *output; 
    IBOutlet NSTextField *password; 
    NSArray *filenames; 
    NSMutableArray *arguments; 
    NSArray *argumentsFinal; 
} 

@property (assign) IBOutlet NSWindow *window; 
@property (retain) NSArray *filenames; 
@property (copy) NSMutableArray *arguments; 

- (IBAction)chooseInput:(id)sender; 
- (IBAction)chooseOutput:(id)sender; 
- (IBAction)createZip:(id)sender; 

@end 

AppDelegate.m

#import "ZipLockAppDelegate.h" 

@implementation ZipLockAppDelegate 

@synthesize window = _window; 
@synthesize filenames; 
@synthesize arguments; 

- (IBAction)chooseInput:(id)sender { 
    NSOpenPanel *openZip = [[NSOpenPanel alloc] init]; 
    [openZip setCanChooseFiles:YES]; 
    [openZip setCanChooseDirectories:YES]; 
    [openZip setCanCreateDirectories:NO]; 
    [openZip setAllowsMultipleSelection:YES]; 
    [openZip setTitle:@"Select All Files/Folders to be zipped"]; 
    int result = [openZip runModal]; 
    if (result == 1) { 
     filenames = [openZip filenames]; 
    } 
} 

- (IBAction)createZip:(id)sender { 
    [progress startAnimation:self]; 
    arguments = [NSMutableArray arrayWithObjects:@"-P", [password stringValue], [output stringValue], nil]; 
    [self.arguments addObjectsFromArray:filenames]; 
    argumentsFinal = [[NSArray alloc] initWithArray:self.arguments]; 
    NSTask *makeZip = [[NSTask alloc] init]; 
    [makeZip setLaunchPath:@"/usr/bin/zip"]; 
    [makeZip setArguments:argumentsFinal]; 
    [makeZip launch]; 
    [makeZip waitUntilExit]; 
    [progress stopAnimation:self]; 
} 

И это ошибка я получаю в журнале. Я не могу понять, почему я это получаю.

EXC_BAD_ACCESS(code=13,address=0x0) 

Это указывает на линии [arguments addObjectsFromArray:filenames];

Я могу сделать только первую часть о селекторе и экземпляр, но я не знаю, что это значит. Помощь ...

+1

Вы должны использовать '-mutableCopy', когда вы устанавливаете свой массив, а не' -copy'. Вы используете ARC? –

+1

'addObjectsFromArray:' - правильный способ добавления объектов из другого массива в конец изменяемого массива. Кроме того, 'argumentsFinal' не требуется; каждый NSMutableArray является NSArray, поэтому вы можете просто использовать 'self.arguments' для аргументов задачи. –

+0

Я не использую ARC – drewsdunne

ответ

1

Будьте последовательны. Во-первых, префикс все ваши переменные экземпляра с подчеркиванием, а не только некоторые из них.

// Change this... 
@synthesize window = _window; 
@synthesize filenames; 
@synthesize arguments; 

//...to this 
@synthesize window = _window; 
@synthesize filenames = _filenames; 
@synthesize arguments = _arguments; 

Тогда вы не будете в состоянии сделать это больше:

arguments = [NSMutableArray arrayWithObjects:@"-P", [password stringValue], [output stringValue], nil]; 

Обратите внимание, что на следующей строке, вы делаете это:

[self.arguments addObjectsFromArray:filenames]; 

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

self.arguments = [NSMutableArray arrayWithObjects:@"-P", [password stringValue], [output stringValue], nil]; 

Компилятор переводит self.arguments = someArg в [self setArguments:someArg]. В этом случае метод setter необходим для сохранения объекта, чтобы он не был освобожден, в то время как ссылка все еще сохраняется в переменной экземпляра _arguments.

+0

Я предполагаю, что window = _window - это код шаблона, а остальные добавлены. –

+0

да это добавленный код шаблона – drewsdunne

+0

СПАСИБО ВАС это сработало. Сохранение последовательности помогало с помощью self.arguments – drewsdunne

1

Ваш arguments объект является NSArray, а не NSMutableArray. Вы можете добавлять объекты в изменяемый массив по определению. Попробуйте следующее:

arguments = [NSMutableArray arrayWithObjects:@"-P", [password stringValue], [output stringValue], nil]; 
+0

Спасибо, что исправил эту проблему, но теперь у меня есть новая. Теперь мое приложение сбой и дает мне «EXC_BAD_ACCESS (code = 13, address = 0x0)» и его указание на строку '[self.arguments addObjectsFromArray: filenames];' и я не знаю, что не так – drewsdunne

+0

Я предполагаю, что selectInput: был выполнен до вызова createZip? Вы используете ARC? Если нет, то вам, возможно, придется сохранить имя файла внутри selectInput:. –

+0

Я не использую ARC, и я ее сохраняю – drewsdunne

1

Вы пробовали отладить его, чтобы узнать, инициализированы ли имена файлов? Глядя на ваш crashlog, вы ссылаетесь на указатель на нуль. Кажется, ни имена файлов, ни аргументы никогда не инициализируются.

Кроме того, попробуйте и установите массив аргументов в виде сохранения, а не копии.

Вы также, кажется, продолжаете идти взад и вперед со своими рекомендациями. Если вы не хотите продолжать набирать self.arguments, создайте ivar в своем заявлении о синтезе и просто придерживайтесь этого.

@synthesize filenames = _filenames; 
@synthesize arguments = _arguments; 

[_arguments addObjectsFromArray:_filenames]; 
+0

ivar создан путем синтеза того, указано ли другое имя или нет. Он имеет то же имя, что и свойство по умолчанию; '@synthesize arguments;' создает '- (NSMutableArray *) аргументы',' - (void) setArguments: (NSMutableArray *) newArguments' и ivar с именем 'arguments'. –

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