2011-04-19 5 views
0

Мое приложение разбивается с ошибкой «Завершение приложения из-за неотображенного исключения» NSInvalidArgumentException », причина: '- [CALayer firstName]: нераспознанный селектор, отправленный экземпляру 0x4d382c0'" ,Objective C: Завершение приложения из-за неперехваченного исключения «NSInvalidArgumentException»

Это то, что я пытался сделать.

1) Я создал класс 'Person' для хранения информации, как ПгвЬЫате, 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

+0

Можете ли вы опубликовать stacktrace? –

+0

Где вы выделяете и инициализируете personArray – Krishnabhadra

+0

@ Krishnabhadra, я создал новый Mutable Array и инициализировал его. "NSMutableArray * array = [[NSMutableArray alloc] initWithObjects: person, nil];" Затем я назначаю его моему персонажу «self.personArray = array;» – Zhen

ответ

2

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

personArray = array; 

в

self.personArray = array; 

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

+0

да, это была ошибка, которую я сделал. Я изменил его в соответствии с тем, что вы упомянули, и теперь он работает :) Спасибо миллион! – Zhen

+0

Отлично! Рад, что сделал это. – McCygnus

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 *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.

+0

спасибо за ответ :) Yeap Я понял, что именно так я назначал массивы. Ужасная ошибка. Спасибо, и мой код работает сейчас. Цените свою помощь по этому поводу. – Zhen

+0

еще раз спасибо за заметку :) Могу ли я уточнить с вами, почему нехорошо использовать свойства в методах init? И почему также лучше сделать копию? – Zhen

+0

@ Zhen: Основная причина не использования свойств в '-init' заключается в том, что любой подкласс может переопределять свойства. Аналогично для '-dealloc' и дополнительно в параметре' -dealloc' свойство nil приведет к неправильному запуску KVO. Я использовал '-copy', потому что ваши входные параметры были« NSString's ». 'NSString' поддерживает' NSCopying'. Кстати, ваши свойства 'NSString' должны быть объявлены' copy', а не 'keep'. – JeremyP

Смежные вопросы

 Смежные вопросы