2012-03-17 95 views
0

所以我需要添加用戶使用NSOpenPanel選擇的NSArray中的對象,並將所有文件名放入此數組中。然後我有一個名爲參數的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嗎? – 2012-03-17 16:27:39

+1

'addObjectsFromArray:'是將另一個數組中的對象添加到可變數組末尾的正確方法。另外,'argumentsFinal'是不必要的;每個NSMutableArray都是一個NSArray,所以你可以使用'self.arguments'來完成任務的參數。 – 2012-03-17 18:28:48

+0

我沒有使用ARC – drewsdunne 2012-03-18 04:34:58

回答

1

要一致。首先,前綴全部帶有下劃線的實例變量,而不僅僅是其中的一部分。

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

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

那麼你將無法再做到這一點:同樣

[self.arguments addObjectsFromArray:filenames]; 

,是:

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

注意,在非常下一行,你這樣做一致的使用屬性而不是直接訪問實例變量將幫助您避免這些類型的錯誤。所以,重新編寫前行使用屬性,就像這樣:

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

編譯器編譯self.arguments = someArg[self setArguments:someArg]。在這種情況下,需要使用setter方法來保留對象,以便在引用仍然存儲在實例變量中時不會解除分配。

+0

我假設window = _window是模板代碼,其餘部分是添加的。 – 2012-03-17 23:45:51

+0

是的,這是添加的模板代碼 – drewsdunne 2012-03-18 04:42:49

+0

謝謝你這工作。保持一致確實有助於自我。參數 – drewsdunne 2012-03-18 04:45:26

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 2012-03-17 15:51:59

+0

我假設chooseInput:在createZip被調用之前?你在使用ARC嗎?如果沒有,那麼你可能不得不在chooseInput中保留filename。 – 2012-03-17 16:30:11

+0

我沒有使用ARC,我保留它 – drewsdunne 2012-03-18 04:42:22

1

您是否嘗試過調試它以查看文件名是否已初始化?看着你的crashlog,你正在引用一個零指針。似乎文件名或參數從未初始化。

此外,嘗試將您的參數數組設置爲保留類型而不是複製。

你似乎也一直在與你的參考。如果您不想繼續輸入self.arguments,請在您的合成語句中創建一個ivar,然後堅持。

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

[_arguments addObjectsFromArray:_filenames]; 
+0

伊娃是通過合成來創建的,不管是否指定了其他名稱。它與默認的屬性名稱相同; '@synthesize arguments;'創建' - (NSMutableArray *)arguments',' - (void)setArguments:(NSMutableArray *)newArguments'和一個名爲'arguments'的ivar。 – 2012-03-17 18:12:04

相關問題