Статический экземпляр преждевременно высвобождает свойства с ARC - PullRequest
1 голос
/ 30 марта 2012

У меня есть статическая переменная экземпляра, которая используется в моем приложении.У него есть свойства.Эти свойства используются в моем приложении и, кажется, работают довольно хорошо.Однако иногда свойства высвобождаются преждевременно.Странно то, что объект, который тянет эти свойства, сохраняет одни и освобождает другие.Что было бы хорошим способом гарантировать, что свойства моего объекта не будут освобождены преждевременно.

Редактировать: Оказывается, проблема вообще не была преждевременной.Это была проблема конверсии.Спасибо всем за помощь.

@interface Game : NSObject

@property (nonatomic, strong) PFObject     *gameObject;
//@property (nonatomic, strong) Concept     *concept; // Will need to add Concept Object to GameObject once it's wrapper is done
@property (nonatomic, strong) User         *initialPlayer;
@property (nonatomic, strong) User         *invitedPlayer;         
@property (nonatomic, strong) User         *lastPlayedPlayer;
@property (nonatomic, strong) NSDate       *lastPlayedDate;
@property (nonatomic, strong) NSDate       *timeOutDate;
@property (nonatomic, assign) int           timerTicks;
@property (nonatomic, assign) int           currentRoundNumber;
@property (nonatomic, strong) User          *winnerPlayer;         
@property (nonatomic, assign) int           initialPlayerPoints;
@property (nonatomic, assign) int           invitedPlayerPoints;
@property (nonatomic, assign) int           currentPlayerPoints;
@property (nonatomic, assign) GameStatus    status;
@property (nonatomic, assign) int           initialPlayerTimeouts;
@property (nonatomic, assign) int           invitedPlayerTimeouts;
@property (nonatomic, assign) BOOL          isInitialPlayer;
@property (nonatomic, strong) NSMutableDictionary *rounds;
@property (nonatomic, strong, readonly)     Round *currentRound;

+(void)getActiveUserGameObjects:(PFUser *)user target:(id)target selector:(SEL)selector;
+(void)getYourTurnGameObjects:(PFUser *)user target:(id)target selector:(SEL)selector;
+(void)getTheirTurnGameObjects:(PFUser *)user target:(id)target selector:(SEL)selector;
+(void)getGameObjects:(PFUser *)user yourTurn:(id)yourTurn target:(id)target selector:(SEL)selector;

+(Game*)currentGame;
+(void)setCurrentGame:(Game*)currentGame;

..

//.m @implementation   
..

static Game *sharedInstance = nil;
..


+(Game*)currentGame
{
    return sharedInstance;
}

+(void)setCurrentGame:(Game*)currentGame
{
    sharedInstance = currentGame;
}


...

#pragma mark - Player Setters and Getters

-(void)setInvitedPlayer:(User *)invitedPlayer
{
    if (nil != invitedPlayer.userObject)
    {
        [self.gameObject setObject:invitedPlayer.userObject forKey:GAME_INVITED_PLAYER];
    }
}

-(User*)invitedPlayer
{
    NSObject *value = [self.gameObject objectForKey:GAME_INVITED_PLAYER];
    if ([value isKindOfClass:[PFUser class]])
    {
        return [User userFromPFUser:(PFUser*)value];
    }

    return nil;
}

Ответы [ 2 ]

2 голосов
/ 30 марта 2012

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

Удерживая их, поддерживая сильную ссылку.Крайне маловероятно, что ARC случайно публикует ваши данные.Гораздо более вероятно, что вы отпускаете это, когда не хотите.

Первое, на что я бы обратил внимание, - это на использование setCurrentGame:, чтобы убедиться, что вы не работаете случайно.на разных Game объектах одновременно в разных частях программы.Во-первых, убедитесь, что t

ваши +get... методы названы неуклюже (префикс get означает очень специфическую вещь в ObjC, и это не то, что вы здесь делаете).Вероятно, возникнут проблемы с наличием методов класса, которые используют цели и подобные действия.Это заставляет меня задуматься о том, что там происходит внутри.

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

Вообще говоря, этот вопрос слишком расплывчат.Вы заводите с висячими сильными указателями?Кажется, твои сильные указатели стали nil?Ваш игровой объект сам по себе становится nil?Как вы знаете, когда вещи "выпущены"?Или вы имеете в виду, что они освобождают?Вы поставили точку останова в dealloc, чтобы увидеть, кто имел последнюю ссылку на объект?

0 голосов
/ 30 марта 2012

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

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