NSData赋值在分配后直接消失(变为零)

时间:2017-11-08 02:43:12

标签: ios objective-c

首先我要说的是,我不熟悉目标c,也不是iOS开发人员。我正在开发一个本机应用程序,发现我不得不深入研究本机代码。所以,我感谢你对我的耐心,如果你对我可能或不知道的内容做出零假设,我也非常感激。 THX!

我尝试使用react-native-mail,但未能将我选择的照片附加到电子邮件中。

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

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

Here's the code: RNMail.m

欢迎提供所有指示,提示,指导和建议

enter image description here

1 个答案:

答案 0 :(得分:0)

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

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

编辑:再次查看您的屏幕截图,问题很明显;从attachmentPath的内容描述中,我们可以看到它根本不是路径,而是包含一个URL字符串(带有方案file:)。因此,您无法将其传递给使用路径的API。这没关系,因为基于URL的机制无论如何都是Apple建议使用的。因此,只需将字符串传递给-[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
}