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

时间:2011-04-19 08:12:42

标签: objective-c uitableview nsmutablearray

我的应用程序崩溃,错误“由于未捕获的异常终止应用程序'NSInvalidArgumentException',原因:' - [CALayer firstName]:无法识别的选择器发送到实例0x4d382c0'”。

这就是我想要做的事情。

1)我创建了一个'Person'类来存储firstName,lastName,email add和电话号码等信息

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;

你能帮忙建议我为什么会收到线程开头列出的错误吗?

感谢你的帮助!

2 个答案:

答案 0 :(得分:2)

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

personArray = array;

self.personArray = array;

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

答案 1 :(得分:1)

当您过度释放一个对象并且该空间已被重用于其他内容(在您的情况下为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中发布所有内容。