目标 C:由于未捕获的异常“NSInvalidArgumentException”而终止应用程序

Posted

技术标签:

【中文标题】目标 C:由于未捕获的异常“NSInvalidArgumentException”而终止应用程序【英文标题】:Objective C: Terminating app due to uncaught exception 'NSInvalidArgumentException' 【发布时间】:2011-04-19 08:12:41 【问题描述】:

我的应用程序崩溃并出现错误“由于未捕获的异常 'NSInvalidArgumentException' 导致应用程序终止,原因:'-[CALayer firstName]: unrecognized selector sent to instance 0x4d382c0'”。

这就是我想要做的。

1) 我创建了一个“Person”类来存储名字、姓氏、电子邮件地址和电话号码等信息

Person.m 文件:

@implementation Person
@synthesize firstName, lastName, email, phoneNumber;

-(Person *)initWithfirstName:(NSString *)thisFirstName lastName:(NSString *)thisLastName email (NSString *)thisEmail phoneNumber:(NSString*)thisPhoneNumber
 
    if(self = [super init]) 
    
        self.firstName = thisFirstName;
        self.lastName = thisLastName;
        self.email = thisEmail;
        self.phoneNumber = thisPhoneNumber;
    
return self;

@end

2) 将人员列表存储在可变数组中

Person *firstPerson = [[Person alloc] initWithfirstName:@"Zen" lastName:@"Yong" email:@"" phoneNumber:@""];
person = firstPerson;

NSMutableArray *array = [[NSMutableArray alloc]initWithObjects:person, nil];

personArray = array;

[array release];

3) 在表格视图中列出人员信息列表

int row = [indexPath row];
Person *aPerson = (Person *)[self.personArray objectAtIndex:row];

cell.textLabel.text = aPerson.firstName;

你能帮忙告诉我为什么我在帖子开头列出了错误吗?

感谢您对此的帮助!

【问题讨论】:

你在哪里分配和初始化 personArray @Krishnabhadra,我创建了一个新的可变数组并对其进行了初始化。 “NSMutableArray *array = [[NSMutableArray alloc]initWithObjects:person, nil];”然后我将它分配给我的 personArray "self.personArray = array;" 【参考方案1】:

由于指针悬空,您正在崩溃。您将 personArray 数组设置为您创建的数组,然后释放该数组,将 personArray 作为悬空指针。根据您发布的内容,我假设 personArray 是该类的一个属性。如果是这样,改变:

personArray = array;

self.personArray = array;

应该可以解决问题。你现在拥有它的方式,数组指针只是被分配给 personArray 指针。您必须为属性调用 set setter 方法才能获得正确的内存管理。

【讨论】:

是的,那是我犯的错误。我根据您提到的内容对其进行了更改,现在可以使用了:)谢谢一百万!【参考方案2】:

此问题通常发生在您过度释放对象并且空间已被重用于其他东西(在您的情况下为 CALayer)时。我在这里看不到可能导致这种情况的具体问题,但你有一个明确的错误:

Person *firstPerson = [[Person alloc] initWithfirstName:@"Zen" lastName:@"Yong" email:@"" phoneNumber:@""];
person = firstPerson;

NSMutableArray *array = [[NSMutableArray alloc]initWithObjects:person, nil];

personArray = array;

[array release];

创建一个数组,然后立即释放它。很可能该数组已被释放。但是,其中的 person 对象还没有被释放,所以除非你稍后再做,否则它会泄漏。你可能想要更多类似的东西:

Person *firstPerson = [[Person alloc] initWithfirstName:@"Zen" lastName:@"Yong" email:@"" phoneNumber:@""];

NSMutableArray *array = [[NSMutableArray alloc] initWithObject: firstPerson];

[firstPerson release];

然后你必须将数组保存在某个地方,所以如果 personArray 是一个实例变量,你就可以这样做

personArray = array; // personArray must be nil beforehand to stop leaks.

或者如果它是一个属性(这样更好):

[self setPersonArray: array]; // or equivalently self.personArray = array;
[array release];

最后一点无关紧要,最好不要在-init-dealloc 方法中使用属性。你的-init 应该是这样的:

if(self = [super init]) 

    firstName = [thisFirstName copy];
    lastName = [thisLastName copy];
    email = [thisEmail copy];
    phoneNumber = [thisPhoneNumber copy];

别忘了在-dealloc 中发布所有内容。

【讨论】:

感谢您的回复 :) 是的,我意识到这是我分配数组的方式。可怕的错误。谢谢,我的代码现在可以工作了。感谢您在这方面的帮助。 再次感谢您的注意:) 我能否向您解释一下为什么在 init 方法中使用属性不好?另外,为什么做一个副本也更好? @Zhen:不使用-init中的属性的主要原因是任何子类都可以覆盖这些属性。同样,-dealloc-dealloc 将属性设置为 nil 会导致 KVO 错误触发。我使用-copy,因为你的输入参数都是NSStrings。 NSString 支持 NSCopying。顺便说一句,你的NSString 属性应该声明为copy 而不是retain

以上是关于目标 C:由于未捕获的异常“NSInvalidArgumentException”而终止应用程序的主要内容,如果未能解决你的问题,请参考以下文章

** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“应用程序试图在目标上呈现一个 nil 模态视图控制器

NSBundle 未加载 - 目标 C

因关系改变而产生的错误

osx上的c ++未捕获异常

由于未捕获的异常“NSRangeException”而导致应用程序终止

由于未捕获的异常而终止应用程序 [UIImageView _isResizable]