我有一个在我的应用程序中使用的静态实例变量。它有属性。这些属性通过我的应用程序使用,似乎工作得很好。但是,有时属性会过早释放。奇怪的是,拉动这些属性的对象会保留一些并释放其他属性。什么是确保我的对象的属性不会过早释放的好方法。
编辑:事实证明,这个问题并非过早发布。这是一个转换问题。谢谢大家的帮助。
@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;
}
答案 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>