2012-04-27 3 views
1

Чтобы начать, позвольте мне сказать вам, что я являюсь новичком Objective-C. Это моя проблема:Обход NSMutableArray?

У меня есть NSMutableArray, в котором хранятся объекты, (Player), который имеет имя игрока и его счет.

Я могу добавить объекты к массиву с помощью addObject, но у меня возникли проблемы с перемещением этого массива. Это как я это делаю:

// Get the reference to the array 
NSMutableArray *myarray = [delegate getArray]; 
// Create a numerator 
NSEnumerator *e = [myarray objectEnumerator]; 
id object; 
while (object = [e nextObject]) 
{ 
    [object printPlayer]; 
} 

Метод printPlayer принадлежит к классу игрока, и он просто печатает имя и счет.

Проблема заключается в том, когда у меня есть три игрока в массиве, и я пытаюсь напечатать содержимое, он достигает эту ошибку внутри метода printPlayer:

Thread 1: EXC_BAD_ACCESS(code=1, address=0x0000008) 

Как ни странно, если я использую NSLog(@"%@", object); вместо [object printPlayer]; он печатает ссылка на объект и не достигает какой-либо ошибки.

Любой мог указать мне, что может быть проблема, когда я пытаюсь использовать [object printPlayer]

Приветствия

Update 1: Это мой метод printPlayer:

-(void) printPlayer 
{ 
    NSLog(@"\n\nName: %@\nScore: %d", playerName, playerScore); 
} 

Update 2 :

Player.h:

@interface PROGPlayer : NSObject 
@property (nonatomic, assign) NSString *playerName; 
@property (nonatomic, assign) int playerScore; 
-(id) init: (NSString *) n; 
-(void) printPlayer; 
@end 

Player.m:

#import "PROGPlayer.h" 
@implementation PROGPlayer 

@synthesize playerName; 
@synthesize playerScore; 
/** 
* Player's class constructor 
* @param n Player's name 
* @param s Player's score 
*/ 
-init: (NSString *) n 
{ 
    if (!(self = [super init])) return nil; 
    else 
    { 
     playerName = n; 
     playerScore = 0; 
    } 
    return self; 
} 

-(void) printPlayer 
{ 
    NSLog(@"\n\nName: %@\nScore: %d", playerName, playerScore); 
} 
@end 
+0

Вы используете автоматический подсчет ссылок в вашем проекте? –

+0

не отвечает на вопрос .. НО ОБЩИЙ SUGGESTION http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/Chapters/ocFastEnumeration.html – Neo

+2

Вы могли бы иметь ошибку в вашем printPlayer код. Можете ли вы опубликовать это? –

ответ

2

Вашего имущество Playername должно лучше быть скопировано вместо назначена

@property (nonatomic, copy) NSString *playerName; 

При попытке доступа присвоенного значения, объект, скорее всего, ушел причину плохой доступа.

Также не забудьте освободить playerName в dealloc, когда вы установите свойство для копирования.

Приветствия

+0

Это начало, но оно по-прежнему не сохранится в init: приведено выше :) – davehayden

+0

Абсолютно, self.playerName = n то, что ему нужно – Mario

+0

@Mario спасибо Марио Я использую копию сейчас, и все работает плавно. Я также присваиваю свои свойства self.playerName = n и self.playerScore = 0. Большое спасибо. – ivantxo

1

Вы просто хотите перечислить массив?

for (CustomClass *object in myArray){ 
    [object printPlayer]; 
} 
+0

Бывает так же. В какой-то момент, когда я добавляю больше игроков, обычно 3 или 4, происходит сбой кода printPlayer. – ivantxo

1

Либо то, что Майк Z сказал или «сырой»:

for (int i = 0; i < myArray.count; i++) { 
    CustomClass* object = [myArray objectAtIndex:i]; 
    [object printPlayer]; 
} 

Хотя есть более изящные схемы, вы можете четко понимать, что это один делает, и каким образом NS (Mutable) Массив является простым аналогом стандартного массива C.

3

Похоже, ваша проблема в том, как вы определяете свои свойства.

Вы используете назначить, а не сильный или копия.

Вкратце, это потому, что сильный подразумевает, что вы хотите, чтобы ваш объект сохранялся.

Использование копию означает, что вы хотите создать новую копию объекта или значение и установить, что в качестве стоимости вашего имущества ... Как Марио и Jarsen объяснить, используя копию лучше практик при работе с массивы, чтобы предотвратить мутирование массива (т.е. значения изменены), в то время как он перечисляется/перемещается. С помощью копия также сохраняет новый объект.

Если вы используете ARC, и ваши объекты не сохраняются, они автоматически будут выпущены компилятором.

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

Я предполагаю, что произошло то, что вы назначали свою переменную свойству, но переменная освобождалась (и, следовательно, приводила к нулю) и вызывала сбой.

Вот несколько ссылок:

New to Objective C: Need help understanding strong reference vs assign

Objective-C ARC: strong vs retain and weak vs assign

Clarification on assign, retain, copy, strong?

+0

копия, вероятно, станет еще лучшим выбором, как предлагает Марио. Использование копии вместо сильных свойств, таких как NSString или NSArray, которые имеют изменяемые подклассы, является хорошей практикой, потому что она защищает вас от случайного изменения этого значения, поскольку вы обычно хотите удержать значение, полученное во время назначения. – Jarsen

+1

спасибо, обновил мой ответ. –

+0

@ C4-Travis Эффективно Теперь я использую копию и присваиваю свои свойства self.playerName = n и self.playerScore = 0. Все работает! Спасибо за ссылки. – ivantxo

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