首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSSavePanel问题

NSSavePanel问题
EN

Stack Overflow用户
提问于 2011-08-26 10:05:44
回答 2查看 671关注 0票数 0

我刚开始接触可可编程,但我在C++方面有相当多的经验;

我对NSSavePanel类有一些问题。无论何时我使用它(如下所示),我都可以看到(通过使用断点)代码试图执行结束括号。然后,我在main.h文件中收到来自Xcode的BAD_ACCESS消息。我无论如何也找不出我做错了什么。代码如下:

代码语言:javascript
复制
- (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时,我没有得到任何崩溃。

提前感谢您,如果这是一个简单的修复,我向您道歉。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-26 10:21:42

你的代码有几个问题。

  • 您将saveString声明为NSMutableString,但将其初始化为(不可变) NSString,然后根本不使用该字符串,而是将其替换为从absoluteString返回的自动释放(且不可变)NSString,从而导致原始字符串leak.
  • NSString既不响应deleteCharactersInRange:也不响应appendString (这些都是D18errorSave的方法,您无论如何都应该将其初始化为)。H219 H120您永远不应该自己调用D21,请改用release。但不要释放saveString,因为它已经是自动释放的(参见上文),您在这里过度释放它,这将在自动释放池耗尽时导致崩溃。
票数 2
EN

Stack Overflow用户

发布于 2011-08-26 10:08:56

好的,你的代码有几个问题:

具有尾随分号的方法签名

代码语言:javascript
复制
(void)scannerDevice:(ICScannerDevice*)scanner didCompleteScanWithError:
    (NSError*)error;

编辑:根据@omz和@Rudy Velthuis,Objective-C允许在实现方法签名上使用尾随分号。所以你可以忽略这个“问题”。

您应该使用获取句柄的类实例来保存面板

代码语言:javascript
复制
NSSavePanel * savePanel = [NSSavePanel savePanel];

在模式下,您应该检查运行保存面板的结果

代码语言:javascript
复制
if ([savePanel runModal] == NSOKButton) {
    //...
}

*您正在创建NSString的实例*并将其泄漏,完全没有必要*

代码语言:javascript
复制
NSMutable * saveString = [NSMutableString stringWithString: 
   [[savePopup URL] absoluteString]];

一旦纠正了上面列出的问题,您将需要删除两条dealloc行,因为对象现在将自动释放。请注意,您通常希望在代码中调用release,而不是dealloc。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7199323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档