Здесь недостаточно кода, чтобы сказать, в чем проблема, но из сообщения об ошибке я бы предположил, что объект playerId - это то, что не сохраняется. То есть, похоже, что с вашим tempCharacter все в порядке, но не поле playerId.
Если у вас есть
@property(nonatomic,retain) SomeObject *playerId;
тогда помните, что
playerId = foo;
будет НЕ удерживать объект за вас. Вы должны использовать аксессор:
self.playerId = foo;
РЕДАКТИРОВАТЬ в ответ на вопрос Тома-edit:
Я абсолютно гарантированно гарантирую, что объекты, помещенные в NSMutableArray, сохраняются этим массивом до тех пор, пока (а) они не будут удалены или (б) массив не будет освобожден. Так что вы можете перестать смотреть туда, проблема в другом. :)
Одна вещь, которую вы можете попробовать, это добавить следующий код к объекту, который выдается, когда вы думаете, что это не следует:
#pragma mark -
#pragma mark Memory-use debugging
#define DEBUG_RETAIN_RELEASE 0
#define DEBUG_ALLOC_DEALLOC 0
#if DEBUG_ALLOC_DEALLOC
static int allocCounter = 0;
+(id)alloc
{
id me = [super alloc];
NSLog(@"%@ ALLOC (%2d): %@", [me class], ++allocCounter, me);
return me;
}
#endif
#if DEBUG_RETAIN_RELEASE
- (id)retain
{
id result = [super retain];
NSLog(@"%@ retain %@, count: %2d", [self class], self, [self retainCount]);
return result;
}
- (void)release
{
// we have to log BEFORE the release, in case it's the last one! e
NSLog(@"%@ RELEASE %@, count: %2d", [self class], self, ([self retainCount] - 1));
[super release];
}
- (id)autorelease
{
id result = [super autorelease];
NSLog(@"%@ AUTOrelease %@, count: %2d", [self class], self, [self retainCount]);
return result;
}
#endif
// ...
- (void)dealloc
{
#if DEBUG_ALLOC_DEALLOC
NSLog(@"%@ dealloc (%2d): %@", [self class], --allocCounter, self);
#endif
[self releaseMyStuff];
[super dealloc];
}
Затем начните с DEBUG_ALLOC_DEALLOC = 1 и установите точку останова в операторе журнала dealloc. Если это не помогло, установите DEBUG_RETAIN_RELEASE = 1 и прервите как сохранение, так и освобождение.
Вы будете удивлены тем, что iOS сохраняет все, что вы получаете, но не беспокойтесь об этом, iOS обещает сбалансированный re-release при правильном использовании. Я просто предупреждаю вас, потому что вы, возможно, ожидаете гораздо меньшего количества удержаний, и будете удивлены, увидев, как он поднимается во время той или иной операции.
Удача!