目标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中释放所有内容。

要回复问题请先登录注册