静态实例使用ARC过早释放属性

时间:2012-03-29 20:20:13

标签: objective-c ios ios5

我有一个在我的应用程序中使用的静态实例变量。它有属性。这些属性通过我的应用程序使用,似乎工作得很好。但是,有时属性会过早释放。奇怪的是,拉动这些属性的对象会保留一些并释放其他属性。什么是确保我的对象的属性不会过早释放的好方法。

编辑:事实证明,这个问题并非过早发布。这是一个转换问题。谢谢大家的帮助。

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

答案 0 :(得分:2)

  

什么是确保我的对象的属性不会过早释放的好方法。

通过保持强有力的参考来抓住它们。 ARC随机发布您的数据的可能性极小。更有可能的是,当你不打算放弃时,你会放弃它。

我看到的第一个地方是您使用setCurrentGame:,确保您不会在程序的不同部分同时意外地处理不同的Game个对象。首先,确保t

你的+get...方法名称笨拙(get前缀意味着ObjC中的一个非常具体的东西,而不是你在这里做的事情)。拥有像这样的目标和行动的类方法似乎有可能遇到麻烦。这让我想知道里面发生了什么。

您在两种User对象之间的转换有点可疑,我确保您不会意外丢弃User或PFUser对象。

一般来说,这个问题过于模糊。你是否正在d strong strong strong strong strong strong?您的强力指针似乎变成了nil吗?你的游戏对象本身是nil吗?你怎么知道什么时候被“释放”?或者你的意思是他们要解除分配?您是否在dealloc中放置了一个断点,以查看谁最后引用了该对象?

答案 1 :(得分:0)

确保您的属性是(保留)类型(我认为与强大相同),并在应用程序委托中保留一个实例(以便ARC将该引用视为对程序的整个执行有效)。 / p>