我的应用程序崩溃,错误“由于未捕获的异常终止应用程序'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;
你能帮忙建议我为什么会收到线程开头列出的错误吗?
感谢你的帮助!
振
答案 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
中发布所有内容。