【问题标题】:Creating a NSURL from an NSURL instance variable - invalid pointer从 NSURL 实例变量创建 NSURL - 无效指针
【发布时间】:2013-07-20 17:50:20
【问题描述】:

我有一个将属性定义为NSURL 的对象:

@interface fcpElement : NSObject
@property (copy) NSString* elementName;
@property (copy) NSURL* elementPath;
@property (copy) NSURL* elementParent;
@property () BOOL elementIsHidden;
@property (copy) NSString* elementType;

-(id)initWithName : (NSString*) elementName path: (NSURL*) elementPath parent: (NSURL*) elementParent hiddenValue: (BOOL) elementIsHidden type: (NSString*) elementType;

@end

在我的应用程序控制器中,我创建了一个 NSMutableArray 并使用我的 init… 方法用我的对象填充它。 然后我有一个按钮,它调用应用程序控制器上的一个方法,该方法通过从数组中的一个对象调用实例变量来创建一个新的NSURL,如下所示:

for(currentElement in _finalCutData) {
    NSURL *currentElementPath = [currentElement elementPath];

最终我想进行比较,看看这个新 URL 是否与另一个 URL 相等,但如果我执行以下任何操作,我总是会收到导致程序停止的错误:

NSURL *currentElementPathAbsolute = [currentElementPath absoluteURL];

出现错误:-[__NSCFString absoluteURL]: unrecognized selector sent to instance

如果我添加一个断点,它会说currentElementPath 是一个无效指针。但是如果我 NSLog [currentElement elementPath] 我会得到其中包含的 URL。

如何从我的实例变量中获取 URL 以便我可以使用它?我在属性声明中使用了错误的参数类型吗?还是别的什么?

【问题讨论】:

  • 显然currentElementPathNSString,而不是NSURLelementPath 方法有什么作用?我在文档中没有看到 - 是你写的吗?
  • “如果我添加一个断点,它会说 currentElementPath 是一个无效的指针。”你在哪里设置断点?如果您将其设置在声明currentElementPath 的行上,则它的初始化尚未发生,因此您需要执行一次(即“执行此行”),变量才会有一个值供您打印.另一种方法是在方法中的任何后续行设置断点;我会把它放在下一行。
  • 一般的答案是使用它的 Zombies 模板在 Instruments 下运行您的应用程序,并在您尝试向其发送 absoluteURL 消息之前查看是什么杀死了 URL。更具体地说,我认为您没有显示在这两点之间,即currentElementPath 的声明和absoluteURL 消息。请编辑您的问题以包含 currentElementPath 声明和 absoluteURL 消息中使用它之间的所有代码。
  • 我已经更新了我的代码,其中有一些如何省略了我的对象中的其余属性声明,以防万一。 @PeterHosey绝对URL声明是我检索实例变量后的下一行代码,它全部在一行代码中,但我将它分成2行以尝试找出问题所在。

标签: objective-c cocoa nsurl


【解决方案1】:

你的问题很可能是这个调用:

[currentElement elementPath];

正在返回一个字符串,而不是一个 URL。 -elementPath 是如何实现的?您是否看到任何编译器警告?

我假设-elementPath 被实现为一个简单的getter 方法(可能是@property)。在这种情况下,错误在于首先存储该值的代码。

您使用的是 ARC 还是手动内存管理?如果是后者,你也有可能在这里遇到僵尸。您没有保留 URL,因此它被释放,随后被字符串替换。

【讨论】:

  • elementPath 正如你所说的一个简单的getter方法作为@property(如我上面代码中的fcpElement对象中所列。我数组中的对象从以下代码中获取它们的值:NSURL *filePath; [currentFile getResourceValue:&filePath forKey:NSURLPathKey error:NULL];当前文件是枚举器中的当前对象。我正在使用 ARC
  • @NicholasWarren:NSURLPathKey 的值是一个路径(它是一个字符串),而不是一个 URL。如果你想要一个 URL,你已经有了一个——这就是currentFile。如果你想要一个路径(你通常不应该),你需要一个字符串并按此处理。
  • @PeterHosey 非常感谢 - 这就是解决方案。现在可以正常工作了。
【解决方案2】:

我很惊讶我似乎可以在这个论坛上提供帮助,因为我有点初学者,但是 NSURL 类有你应该使用的初始化方法,比如 initFileURLWithPath: 你可能不应该覆盖 NSURL 初始化方法。

【讨论】:

  • 提问者“覆盖[ing] NSURL 初始化方法”在哪里?
  • 我并没有覆盖初始化方法,只是似乎无法掌握我作为属性在我的对象中的 NSURL 而不会导致错误,除非我正在对其进行 nsloging。
  • 抱歉,我还以为你的课是 NSURL。答案基本上是一样的,你没有正确初始化你的 NSURL 对象。
猜你喜欢
  • 1970-01-01
  • 2017-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
  • 2013-11-24
  • 2011-06-21
相关资源
最近更新 更多