gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:14:50 24 4
gpt4 key购买 nike

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

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

@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;
}

最佳答案

What would be a good way to insure that the properties of my object are not released prematurely.

通过保持强引用来保留它们。 ARC 随机释放您的数据的可能性极小。更有可能的是,您在无意中放弃了它。

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

您的 +get... 方法的命名很笨拙(get 前缀在 ObjC 中意味着非常具体的事情,这不是您在这里所做的事情)。像这样采用目标和操作的 Havings 类方法似乎很可能会遇到麻烦。这让我想知道里面发生了什么。

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

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

关于objective-c - 静态实例使用 ARC 过早释放属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9932885/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com