App终止尝试从对象插入nil对象[0]

时间:2013-10-15 04:56:39

标签: ios objective-c xcode xcode5

此过程正在发送电子邮件,并且工作正常,但框架希望电子邮件的正文是NSArray。所以我尝试将NSString转换为NSDictionary以包含NSArray:

NSDictionary *plainPart = [NSDictionary dictionaryWithObjectsAndKeys:kSKPSMTPPartContentTypeKey,
    message,kSKPSMTPPartMessageKey,kSKPSMTPPartContentTransferEncodingKey, nil];

然后我在这里实现:

smtpTestMessage.parts = [NSArray arrayWithObject:plainPart];

总的来说,这是我的代码:

NSLog(@"Start eMail");


SKPSMTPMessage *smtpTestMessage = [[SKPSMTPMessage alloc] init];
smtpTestMessage.fromEmail = @"***@gmail.com";
smtpTestMessage.toEmail = @"***@yahoo.com";
smtpTestMessage.relayHost = @"smtp.gmail.com";
smtpTestMessage.requiresAuth = YES;
smtpTestMessage.login = @"***@gmail.com";
smtpTestMessage.pass = @"***";
smtpTestMessage.subject = @"***";
smtpTestMessage.wantsSecure = YES;

smtpTestMessage.delegate = self;

NSDictionary *plainPart = [NSDictionary dictionaryWithObjectsAndKeys:kSKPSMTPPartContentTypeKey,
    message,kSKPSMTPPartMessageKey,kSKPSMTPPartContentTransferEncodingKey, nil];


smtpTestMessage.parts = [NSArray arrayWithObject:plainPart];

[NSString stringWithFormat:@"%@",message];

[smtpTestMessage send];
NSLog(@"sent");

但遗憾的是,当我运行应用程序时,电子邮件进入最后阶段......然后应用程序终止说

2013-10-15 00:43:50.512 BullyBox[3662:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderArray initWithObjects:count:]: attempt to insert nil object from objects[0]'
*** First throw call stack:
(0x2f61ae8b 0x399156c7 0x2f5540cb 0x2f556749 0xc77f3 0x31dd555f 0x31dd54fb 0x31dd54cb 0x31dc10f3 0x31dd4f13 0x31dd4bdd 0x31dcfc09 0x31da4f59 0x31da3747 0x2f5e5f27 0x2f5e53ef 0x2f5e3bdf 0x2f54e541 0x2f54e323 0x342852eb 0x31e051e5 0xc91b5 0x39e0eab7)
libc++abi.dylib: terminating with uncaught exception of type NSException

修改

现在我不断收到错误:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString appendString:]: nil argument'

非常感谢任何帮助!谢谢你甚至读这个! xD <3

4 个答案:

答案 0 :(得分:1)

确保plainPart成功创建,而不是零。

答案 1 :(得分:1)

很难判断,但如果我不得不猜测plainPart没有被创造出来。为什么我这么想?我们来看看错误:

[__NSPlaceholderArray initWithObjects:count:]:

这指向alloc / init调用序列。您在分配数组的代码中唯一的位置是:

smtpTestMessage.parts = [NSArray arrayWithObject:plainPart];

因此,如果您尝试使用nil对象plainPart创建一个数组,那么为什么在尝试在位置0插入nil对象时会出现错误。

尝试在代码中的此调用处设置断点。这将帮助您缩小崩溃发生的位置。

答案 2 :(得分:0)

我不确定你在这里做什么

 NSDictionary *plainPart = [NSDictionary dictionaryWithObjectsAndKeys:kSKPSMTPPartContentTypeKey,
message,kSKPSMTPPartMessageKey,kSKPSMTPPartContentTransferEncodingKey, nil];

但根据您的命名约定,您将密钥存储在值位置。你也可以切换到现代的Objective-C语法

 NSDictionary *plainPart =  @{
                                message: kSKPSMTPPartContentTypeKey,
 kSKPSMTPPartContentTransferEncodingKey: kSKPSMTPPartMessageKey
 };

这相当于你写的,但更具可读性。如其他答案中所述,看起来像plainPart的创建存在问题。希望看到这个应该可以更容易调试。

答案 3 :(得分:0)

首先检查此行smtpTestMessage.parts = [NSArray arrayWithObject:plainPart];。 如果是,则smtpTestMessage是否已分配,然后检查此内部是否存在任何数据