Цель C: Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException» - PullRequest
0 голосов
/ 19 апреля 2011

Мое приложение аварийно завершает работу с ошибкой «Завершение приложения из-за необработанного исключения« 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;

Можете ли вы помочь сообщить, почему я получаю сообщение об ошибке, перечисленное в начале потока?

Оцените вашу помощь в этом!

Zhen

Ответы [ 2 ]

2 голосов
/ 19 апреля 2011

Вы зависаете из-за висящего указателя.Вы устанавливаете массив personArray в качестве созданного вами массива, но затем освобождаете массив, оставляя personArray в качестве висячего указателя.Из того, что вы написали, я предполагаю, что personArray - это свойство класса.Если это так, то изменение:

personArray = array;

на

self.personArray = array;

должно решить проблему.Теперь у вас есть указатель массива, который просто присваивается указателю personArray.Вы должны вызвать метод set setter для свойства, чтобы получить правильное управление памятью.

1 голос
/ 19 апреля 2011

Эта проблема обычно возникает, когда вы перепустили объект, и пространство было повторно использовано для чего-то другого (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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...