如何解决目标C:由于未捕获的异常\'NSInvalidArgumentException\'终止应用程序
| 我的应用程序崩溃,错误为“由于未捕获的异常\'NSinvalidargumentexception \',正在终止应用程序,原因:\'-[CALayer firstName]:无法识别的选择器已发送到实例0x4d382c0 \'\”。 这就是我想做的。 1)我创建了一个\'Person \'类来存储诸如firstName,lastName,电子邮件添加和电话号码之类的信息 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数组设置为创建的数组,然后释放该数组,将personArray保留为悬空指针。从您发布的内容来看,我假设personArray是该类的一个属性。如果是这样,请更改:
personArray = array;
至
self.personArray = array;
应该解决问题。您现在拥有的方式是将数组指针分配给personArray指针。您必须为属性调用set setter方法以获取正确的内存管理。,通常,当您释放一个对象并且该空间已被其他用途(在您的情况下为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 *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];
}
而且,别忘了在ѭ10中释放所有内容。版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。