【问题标题】:NSData Assignment Vanishes (becomes nil) Directly After AssignedNSData 赋值在赋值后立即消失(变为 nil)
【发布时间】:2017-11-08 02:43:12
【问题描述】:

首先让我说我不精通目标 c,也不是 iOS 开发人员。我正在开发一个 react-native 应用程序,发现我不得不深入研究原生代码。所以,我感谢您对我的耐心,如果您对我可能知道或可能不知道的内容做出零假设,我将非常感激。谢谢!

我正在尝试使用react-native-mail,但它无法将我选择的照片附加到电子邮件中。

在故障排除中,我第一次跳进了 Xcode 的调试器。单步执行代码,似乎attachmentPath 类似于file:///var/mobile/... 被分配给变量fileData 作为类型NSData。但是,在代码中更进一步,它变成了nil

我不知道为什么会发生这种情况,也不知道如何解决这个问题。这是调试器会话的图像,其中 3 个屏幕截图并排拼接在一起。

Here's the code: RNMail.m

欢迎所有指针、提示、指导和建议

【问题讨论】:

  • 您是否在启用优化的情况下进行编译?如果你忽略侧边栏显示的内容并在调试器中运行po fileData,你会得到什么?
  • 我什至不确定如何知道我是如何编译的。我该怎么说?另外,我在哪里运行po fileData 命令?我看到一个过滤框,但不是这样
  • 请不要发布指向您的代码的链接,将实际(相关)代码以文本形式复制并粘贴到您的问题中。
  • @maddy,我明白你的意思,但在这种情况下,代码的链接是额外的,只会使问题变得混乱。我添加它以防万一有人想要更多上下文。

标签: ios objective-c


【解决方案1】:

在您的第一个屏幕截图中,调试器仍在声明和分配fileData 变量的行上。这意味着该行实际上尚未执行。 -dataWithContentsOfFile: 尚未被调用,因此 fileData 中的值似乎没有意义;您所看到的只是实际分配变量之前的垃圾数据。在您的第二个屏幕截图中,-dataWithContentsOfFile: 方法已完成运行,并返回了nil。你需要做的是弄清楚为什么你会从-dataWithContentsOfFile: 得到nil。可能文件的路径不正确,或者您没有读取它的权限,或者您有沙盒问题。

我建议使用-dataWithContentsOfURL:options:error: 而不是-dataWithContentsOfFile:。这将通过引用返回错误(提前创建一个NSError变量,将其赋值给nil,将指向错误的指针作为第三个参数传递给-dataWithContentsOfURL:options:error:,然后如果方法返回@则检查错误987654334@)。错误的内容很可能会解释在尝试读取文件时出了什么问题。

编辑:再次查看您的屏幕截图,问题很明显;从attachmentPath的内容描述中,我们可以看出它根本不是路径,而是包含一个URL字符串(带有schemefile:)。所以你不能将它传递给使用路径的 API。这没关系,因为 Apple 建议使用基于 URL 的机制。因此,只需将字符串传递给-[NSURL URLWithString:](或者更好的是-[[NSURLComponents componentsWithString:] URL],因为它符合较新的RFC)将其转换为URL。所以,类似:

// Get the URL string, which is *not* a path
NSString *attachmentURLString = [RCTConvert NSString:options[@"attachment"][@"path"]];
// Create a URL from the string
NSURL *attachmentURL = [[NSURLComponents componentsWithString:attachmentURLString] URL];

...

// Initialize a nil NSError
NSError *error = nil;
// Pass a pointer to the error
NSData *fileData = [NSData dataWithContentsOfURL:attachmentURL options:0 error:&error];

if (fileData == nil) {
    // 'error' should now contain a non-nil value.
    // Use this information to handle the error somehow
}

【讨论】:

  • 谢谢查尔斯! Here's a link to the code 您介意在您的答案中包含修改吗?正如我所说,我对目标 c 不是很精通
  • 我不会为你重写你的代码,如果那是你的要求。那是你的工作。但这很简单;只需更改调用以使用返回错误的调用,然后检查该错误是什么。
  • 不,不是要求你重写代码(这不是我开始的代码)。我只是不确定该怎么做...提前创建一个 NSError 变量,将其分配给 nil,将指向错误的指针作为第三个参数传递给 -dataWithContentsOfURL:options:error:,然后检查如果方法返回 nil 则错误
  • 好了。享受
  • 在 Objective-C 中,当您有采用多个参数的方法时,您可以在每个冒号之后放置一个参数 (:)。此外,您还需要在错误之前使用& 才能传递指针。查看我的编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-24
  • 2019-05-08
  • 2013-10-19
  • 2013-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多