【问题标题】:NSURL return nil?NSURL 返回零?
【发布时间】:2012-01-09 23:39:07
【问题描述】:

我在控制器的接口中声明了两个 NSString 和 NSURL 变量

// project file url
NSURL * url_projectURL;

// temp string just for examine
NSString * tempString;

在我名为的应用操作中:

- (IBAction) btnNewProject:(id)sender

// after running save panel and clicked Save
// 
// set project url
url_projectURL = [savePanel URL];
// set temp string
tempString = [url_projectURL absoluteString];
//
NSLog(@"tempString is: %@", tempString);
NSLog(@"ProjectURL is: %@", [url_projectURL absoluteString]);

结果是:

tempString is: file://localhost/Users/kosartofiq/Documents/project.ksf
ProjectURL is: file://localhost/Users/kosartofiq/Documents/project.ksf

但在其他行动中,例如: - (IBAction) btn_test:(NSButton *)sender

NSLog(@"tempString is: %@", tempString);
NSLog(@"ProjectURL is: %@", [url_projectURL absoluteString]);

结果: 对于字符串变量是:

tempString is: file://localhost/Users/kosartofiq/Documents/project.ksf

但是对于 url 变量是 nil 或者在 coe 的运行中显示错误

我的问题是为什么 url 变量将其值更改为 nil 并且在其他操作中使用它时丢失了它的值,但字符串变量保持它的值? 我想使用这个 url 来保存对文件的更改,在我的项目中我会使用它一段时间。

【问题讨论】:

  • 什么是变量saveProject:它是什么类,如何以及在哪里声明和赋值?
  • saveProject 是 NSSavePanel。抱歉,我没有提到我将更改为 savePanel。谢谢
  • 请展示btn_test:的完整实现。
  • btn_test 的实现,如果只是为了打印 nslog 不更多,或者在某些文本接收器 (nstextfield) 中打印值,我只是为了测试而创建的,我在 btn_test 之外的某些过程中使用这些变量值

标签: objective-c cocoa nsurl null


【解决方案1】:

假设您没有使用 ARC,问题在于您将不属于您的对象分配给实例变量。如果对象没有所有者,则可以随时释放它们。您应该声明对象的所有权,最好使用访问器而不是直接设置变量本身。

【讨论】:

  • 我看不懂,你能举例解释一下吗?除了我像 NSURL 一样使用 NSString 之外, NSString 不会失去它的价值,但其他会失去它的价值
  • 如果您要直接分配,您需要这样做:url_projectURL = [[savePanel URL] retain]; 如果您不拥有它们,您必须保留要保留引用的对象。 tempString 没有失去其价值这一事实可能只是运气。
  • @Kosar:不,这不是 Xcode 中的错误。这是关于此类错误的棘手问题之一:不能保证它们总是做错事——它们也不能保证总是做正确的事。 URL 碰巧被覆盖而其他一些对象没有被覆盖的事实只是运气和不可靠的实现细节。
  • 感谢“wades world”的建议,它的工作。写下你的评论就像答案。供您参考,只是 NSURL 失去了它的价值,我有像 NSString 这样的 NSMutableDictionary 不要失去它的价值。不使用保留代码。也许它是 Xcode 4.2.1 中的一些错误(我使用这个版本)
  • ok @Chuck 这意味着我一直在使用保留那些我想将它们用作参考的变量?
【解决方案2】:

在您的示例代码中,url_projectURL 是一个局部变量,而 tempString 和 projectURL 是实例变量。您没有在您的操作方法中使用 projectURL。

在您的操作方法中将所有对 url_projectURL 的引用更改为 projectURL 以匹配您的声明。

【讨论】:

  • sorry 拼写错误,projectURL 是 url_projectURL,我会编辑并更正它。
猜你喜欢
  • 2016-11-24
  • 2011-11-07
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
  • 1970-01-01
  • 2012-03-12
  • 2015-04-05
  • 1970-01-01
相关资源
最近更新 更多