Как добавить объекты из NSArray в конец NSMutableArray? - PullRequest
0 голосов
/ 17 марта 2012

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

Вот что я делаю с кодом: 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];

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

Ответы [ 3 ]

1 голос
/ 17 марта 2012

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

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

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

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

[_arguments addObjectsFromArray:_filenames];
1 голос
/ 17 марта 2012

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

 // 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.

1 голос
/ 17 марта 2012

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

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