2012-03-29 4 views
1

내 응용 프로그램에서 사용되는 정적 인스턴스 변수가 있습니다. 그것은 속성을 가지고 있습니다. 이러한 속성은 내 응용 프로그램을 통해 사용되며 꽤 잘 작동하는 것 같습니다. 그러나 때로는 속성이 조기에 공개됩니다. 이상한 점은 이러한 속성을 가져 오는 개체가 일부 속성을 유지하고 다른 속성을 해제한다는 것입니다. 내 개체의 속성이 조기에 공개되지 않도록하는 좋은 방법은 무엇입니까?정적 인스턴스가 ARC를 사용하여 속성을 조기에 해제

편집 : 그것은 문제가 전혀 방출 조기 아니라고 밝혀졌습니다. 전환 문제였습니다. 모두에게 도움을 주셔서 감사합니다.

@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

속성에 어떤 momory 속성을 사용합니까? – Matthias

+0

헤더를 게시하면 아무도 게시 한 항목의 속성을 정의한 방법을 결정할 수 없습니다. – Sam

+0

좀비 도구로 앱을 테스트 해보십시오. 그렇게하면 너무 많은 시간에 릴리스 된 개체의 전체 보존/릴리스 기록을 얻을 수 있습니다. –

답변

2

내 개체의 속성이 조기에 공개되지 않도록하는 좋은 방법은 무엇입니까?

강력한 참조를 유지하여 이들을 유지하십시오. ARC가 귀하의 데이터를 무작위로 공개하는 것은 거의 불가능합니다. 훨씬 더 많은 가능성은 당신이 의미하지 않을 때 그것을 버리는 것입니다.

먼저 봐야 할 것은 setCurrentGame:을 사용하는 경우 프로그램의 다른 부분에서 다른 Game 개체를 실수로 작업하지 않도록합니다. 먼저,

+get... 메쏘드가 어색하게 이름 붙여진 것입니다 (접두사 get은 ObjC에서 매우 특정한 것을 의미하며, 여기서하는 일이 아닙니다). 이와 같은 목표와 행동을 취하는 Havings 클래스 메서드는 문제가있는 것으로 보입니다. 그것은 저 안에 무슨 일이 일어나고 있는지 궁금하게 만듭니다.

두 종류의 User 개체 사이의 변환은 조금 의심 스럽지만 뜻하지 않을 때 실수로 사용자 또는 PFUser 개체를 삭제하지 않았는지 확인해야합니다.

일반적으로 말하자면,이 질문은 지나치게 모호합니다. 매끄러운 포인터를 매달고 있니? 강한 포인터가 nil이되는 것 같습니까? 게임 개체 자체가 nil이 되었습니까? 어떤 일이 언제 풀려나는지 어떻게 압니까? 아니면 그들이 할당을 취소한다는 의미입니까? dealloc에 중단 점을 넣어 객체에 대한 마지막 참조를 가진 사람을 확인 했습니까?

+0

오브젝트에 대한 dealloc이 없습니다. 너는 ~에 대해 옳아 ..PFUser의 User 객체는 나중에 다른 SDK 또는 서비스로 전환 될 수있는 데이터 객체 주위에 래퍼를 갖는 것을 목적으로합니다. 당신도 맞습니다. 그것이 막연합니다. getter는 데이터 객체 (PFObject)에서 int를 반환합니다. 내 getter에서 intValue를 GameStatus 열거 형으로 반환하면 변수는 (null)이됩니다. –

+0

당신은 언제나'dealloc'을 추가 할 수 있습니다. 어떤 변수가 "null"이됩니까? intValue는 null 일 수 없습니다. 그리고 intValue (이전에는 null이 아니었고 null이되었습니다)를 호출하는 동안 null이된다는 의미입니까? 아니면 뭔가 다른 것을 의미합니까? 나는 언제 일어나는 일인지 정확하게 파악하기 위해해야 ​​할 파기가 더 많다고 생각합니다. –

+0

실제로 문제가 해결되었음을 알리는 질문을 편집했습니다. 내가 바보 같은 실수를하고 NSNumber가 아닌 객체의 intValue를 반환하려고 시도한 것으로 밝혀졌습니다. 클래스의 디자인이 좋지 않고 포스트 생성 및 디버깅에 문제가 있습니다. 도와 주셔서 감사합니다. dealloc 팁 주셔서 감사. 나는 ARC에 매우 익숙하다. –

0

(나는 생각한다, 강한과 동일)을 입력하여 속성 (유지)되어 있는지 확인하고 계속 인스턴스 (그래서 ARC는 전체 실행을위한 유효한 참조를보고 응용 프로그램 대리자로 주심을 당신의 프로그램).

+0

ARC는 보유를 허용하지 않습니다. –

+0

ARC는 속성 속성으로 retain을 허용합니다. 그것은 강한 것에 대한 동의어입니다. –

+0

맞습니다. 객체가 아니기 때문에 int에 retain을 허용하지 않습니다. –

관련 문제