目标 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
,因为你的输入参数都是NSString
s。 NSString
支持 NSCopying
。顺便说一句,你的NSString
属性应该声明为copy
而不是retain
。以上是关于目标 C:由于未捕获的异常“NSInvalidArgumentException”而终止应用程序的主要内容,如果未能解决你的问题,请参考以下文章
** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“应用程序试图在目标上呈现一个 nil 模态视图控制器