我有一个自定义类:
@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的问题。
答案 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提供的内容