我刚开始接触可可编程,但我在C++方面有相当多的经验;
我对NSSavePanel类有一些问题。无论何时我使用它(如下所示),我都可以看到(通过使用断点)代码试图执行结束括号。然后,我在main.h文件中收到来自Xcode的BAD_ACCESS消息。我无论如何也找不出我做错了什么。代码如下:
- (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时,我没有得到任何崩溃。
提前感谢您,如果这是一个简单的修复,我向您道歉。
发布于 2011-08-26 10:21:42
你的代码有几个问题。
saveString声明为NSMutableString,但将其初始化为(不可变) NSString,然后根本不使用该字符串,而是将其替换为从absoluteString返回的自动释放(且不可变)NSString,从而导致原始字符串leak.NSString既不响应deleteCharactersInRange:也不响应appendString (这些都是D18errorSave的方法,您无论如何都应该将其初始化为)。H219 H120您永远不应该自己调用D21,请改用release。但不要释放saveString,因为它已经是自动释放的(参见上文),您在这里过度释放它,这将在自动释放池耗尽时导致崩溃。发布于 2011-08-26 10:08:56
好的,你的代码有几个问题:
具有尾随分号的方法签名
(void)scannerDevice:(ICScannerDevice*)scanner didCompleteScanWithError:
(NSError*)error;编辑:根据@omz和@Rudy Velthuis,Objective-C允许在实现方法签名上使用尾随分号。所以你可以忽略这个“问题”。
您应该使用获取句柄的类实例来保存面板
NSSavePanel * savePanel = [NSSavePanel savePanel];在模式下,您应该检查运行保存面板的结果
if ([savePanel runModal] == NSOKButton) {
//...
}*您正在创建NSString的实例*并将其泄漏,完全没有必要*
NSMutable * saveString = [NSMutableString stringWithString:
[[savePopup URL] absoluteString]];一旦纠正了上面列出的问题,您将需要删除两条dealloc行,因为对象现在将自动释放。请注意,您通常希望在代码中调用release,而不是dealloc。
https://stackoverflow.com/questions/7199323
复制相似问题