NSMutableArray с пользовательскими объектами? - PullRequest
1 голос
/ 25 августа 2010

У меня есть собственный класс:

 @interface Player : NSObject {
   NSInteger mPlayerNo;
 }

 -(id) initWithNum:(NSInteger) playerNum;

 @implementation Player

 -(id) initWithNum:(NSInteger) playerNum
 {
   if(![super init])
   return nil; 
   ... 
   mPlayerNo=playerNum;
   return self;
 }

 @end

Мне нужен массив объектов Player в другом классе программы:

 @interface Spec : NSObject  {
    NSMutableArray * mPlayers;
    ...
  }

Итак, я пытаюсь заполнить mPlayers arrв методе init класса Spec вот так:

- (id)init {
   if(![super init])
      return nil; 
   NSMutableArray * _array=[[NSMutableArray alloc] init];
   mPlayers=_array;
   [_array release];
   Player * _player=[[[Player alloc] initWithNum:(NSInteger)1]autorelease];
   [mPlayers addObject:_player]; // crashes with EXC_BAD_ACCESS

Не работает.Но если я поменяю

   NSMutableArray * _array=[[NSMutableArray alloc] init];
   mPlayers=_array;
   [_array release];

на

   mPlayers=[[NSMutableArray array]retain];

Все работает нормально.Это что-то странное для меня.Пожалуйста, помогите разобраться в проблеме с alloc init.

Ответы [ 3 ]

4 голосов
/ 25 августа 2010

Проблема в том, что вы освобождаете массив перед его использованием.

NSMutableArray * _array=[[NSMutableArray alloc] init]; //Retain count of 1

mPlayers=_array; //Still 1.
//Adding a new pointer to the same object doesn't affect the object's retain count.

[_array release]; //Now it's 0. Array is gone!
2 голосов
/ 25 августа 2010

Если вы присвоите массив, который вы создали, для mPlayers, это не повлияет на количество сохраняемых данных. Если вы затем вызываете release, счетчик удержаний достигает нуля, и объект освобождается.

Поскольку более глубокое понимание этого поведения необходимо для разработки Objective-C, вам может понадобиться взглянуть на документацию Apple предоставляет

2 голосов
/ 25 августа 2010
   NSMutableArray * _array=[[NSMutableArray alloc] init];
   mPlayers=_array;
   [_array release];

Здесь вы создаете массив, а затем немедленно его освобождаете. + Alloc подразумевает сохранение, и вы уравновешиваете его этим выпуском.

Назначение не имеет значения.

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