2010-09-05 3 views
3

EDIT То, что я пытаюсь достичь с помощью кода, заключается в создании массива из 20 уникальных объектов Person. Теперь я знаю, благодаря ребятам ниже, что я уйду от призыва dealloc.Создание массива пользовательских объектов в Objective C

for (int i = 0; i < 20; i++) 
{ 
    Person *myPerson = [[Person alloc] init]; 
    myPerson.name = @"Brian"; 
    myPerson.age = [NSNumber numberWithInteger:23];  
    [myArray addObject:myPerson];  
    [myPerson dealloc];   
} 

В процессе обучения Цель C, поэтому почему этот код может показаться вам безумным. Но я прихожу из Java, поэтому моя логика еще не очень хороша для Objective C.

Я пытался заполнить свой массив объектами на 20 человек. Но, кажется, я все время добавляю одного и того же объекта Object. Затем освобождение, которое побеждает точку.

Так что мой вопрос: что было бы правильным способом заполнить массив 20 различными объектами человека. Имена и возраст будут разными в будущем для каждого человека, но в то же время все они будут одинаковыми, пока я буду учиться.

Это единственный способ сделать это, чтобы набрать много кода, как это:

Person *myPerson1 = [[Person alloc] init]; 
    myPerson.name = @"Brian"; 
    myPerson.age = [NSNumber numberWithInteger:23];  
    [myArray addObject:myPerson1]; 
    Person *myPerson2 = [[Person alloc] init]; 
    myPerson.name = @"Brian"; 
    myPerson.age = [NSNumber numberWithInteger:23];  
    [myArray addObject:myPerson2]; 
    Person *myPerson3 = [[Person alloc] init]; 
    myPerson.name = @"Brian"; 
    myPerson.age = [NSNumber numberWithInteger:23];  
    [myArray addObject:myPerson3]; 

20 раз? Или есть более элегантное решение?

Спасибо за консультацию. -Код

ответ

10

Ваш код цикла правильный, за исключением освобождения myPerson в конце цикла. Вы не хотите освобождать его, так как объект сохраняется массивом. Как правило, вы не хотите напрямую ссылаться на dealloc, вместо этого хотите использовать сохранение/выпуск. Для получения дополнительной информации об управлении памятью проверьте Apple's Guide

Итак, вы правы, за исключением того, что dealloc был изменен для освобождения.

for (int i = 0; i < 20; i++) 
{ 
    Person *myPerson = [[Person alloc] init]; 
    myPerson.name = @"Brian"; 
    myPerson.age = [NSNumber numberWithInteger:23];  
    [myArray addObject:myPerson];  
    [myPerson release];   
} 
+0

Усиление: единственный раз, когда любая нормальная программа Objective-C вызывается 'dealloc', находится в конце переопределения класса' dealloc', и в этом случае вы будете писать '[super dealloc]'. Любое другое использование почти наверняка неверно. – Chuck

+0

Но разве нельзя сказать, что у меня есть массив, содержащий 20 копий одного и того же объекта (20 указателей на один и тот же объект)? То, что я пытаюсь сделать (и не понимаю, как), добавляет 20 уникальных объектов. – 2010-09-05 20:22:00

+0

@ Код: Нет, у вас нет 20 указателей на один и тот же объект. Новый объект создается каждый раз, когда вы пишете '[[Person alloc] init]', который вы выполняете каждую итерацию цикла. Возможно, это выглядело так: вот что происходит с сломанным кодом, потому что каждый раз, когда вы делят объект, его ячейка памяти была освобождена, а следующий объект был выделен по тому же адресу. – Chuck

7

Возможно, самым простым и наиболее «obj-c» способом было бы создать метод класса для человека, который создает человека, которого вы хотите. Точно так же, как [NSString stringWithFormat], вы должны вернуть объект с автореализацией, чтобы вызывающий абонент даже не мог его освободить.

Никогда не называйте dealloc себя - доверием release

- (Person*) personWithName:(NSString*)name andAge:(NSNumber*)age 
{ 
    Person* p = [[Person alloc] init]; 
    p.name = name; 
    p.age = age; 
    [p autoRelease]; 
    return p; 
} 

Теперь вы будете иметь возможность добавлять каждый человек в массив в одной строке без утечки памяти

[myArray addObject:[Person personWithName:@"Brian" andAge:23]]; 
[myArray addObject:[Person personWithName:@"Alice" andAge:4]]; 
[myArray addObject:[Person personWithName:@"Bob" andAge:60]]; 

Дальнейшего чтения: http://www.cocoadev.com/index.pl?AutoRelease

1

Как DHamrick пишет вы не должны dealloc объект вы создаете, это то же самое, как удаление объекта. Он был добавлен в массив, который также retained. Но поскольку вы в цикле создаете новый объект, я могу представить, что новый объект будет иметь тот же адрес, что и ранее удаленный, и, таким образом, старые указатели снова указывают на этот новый объект, заставляя вас поверить, что все они одинаковые. Чтобы выследить такие ошибки, я предлагаю вам изучить возможность использования NSZombie.

http://iosdevelopertips.com/debugging/tracking-down-exc_bad_access-errors-with-nszombieenabled.html

-1

Вот способ создать массив объекта Объект является получить значение из словаря, в котором я хранятся объекты и ключ и значение как объект класса EmpDesignation ..

NSMutableDictionary *Dictperson = [[NSMutableDictionary alloc]init]; 

[Dictperson setObject:FirstEmployee forKey:[NSNumber numberWithInt:1]]; 
[Dictperson setObject:SecondEmployee forKey:[NSNumber numberWithInt:2]]; 
NSNumber *count = [[NSNumber alloc]initWithInt:1]; 
// NSInteger temp = ; 
int cnt=Dictperson.count; 
EmpDesignation *obj[cnt];` 
+0

Какой язык программирования? Просьба представить понятное объяснение и конкретный вопрос. На данный момент мы не можем помочь с этим вопросом в его нынешнем состоянии. –

+0

это объективно c извините за осложнения –

+0

Не нужно извиняться, после всего вы пытаетесь помочь людям здесь. Но я думаю, вам лучше отформатировать код. –

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