带有自定义对象的NSMutableArray?

时间:2010-08-25 19:38:33

标签: objective-c

我有一个自定义类:

 @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

我需要另一个programm类中的Player对象数组:

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

所以,我试图在这个Spec类的init方法中填充mPlayers arr:

- (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 个答案:

答案 0 :(得分:4)

问题是你在使用它之前就已经发布了它。

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!

答案 1 :(得分:2)

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

在这里创建一个数组,然后立即释放它。 + alloc意味着保留,你可以通过该版本来平衡它。

作业无关紧要。

答案 2 :(得分:2)

如果将创建的阵列分配给mPlayers,则不会影响保留计数。 如果您随后调用release,则保留计数达到零并且对象将被取消分配。

由于对此行为的深入理解对于Objective-C开发至关重要,您可能需要查看documentation Apple提供的内容