2012-03-29 2 views
1

Ich habe eine statische Instanzvariable, die in meiner gesamten Anwendung verwendet wird. Es hat Eigenschaften. Diese Eigenschaften werden durch meine Anwendung verwendet und scheinen ziemlich gut zu funktionieren. Manchmal werden die Eigenschaften jedoch vorzeitig freigegeben. Was merkwürdig ist, ist, dass das Objekt, das diese Eigenschaften zieht, einige behält und andere freigibt. Was wäre ein guter Weg, um sicherzustellen, dass die Eigenschaften meines Objekts nicht vorzeitig freigegeben werden.Statische Instanz, die Eigenschaften vorzeitig mit ARC freigibt

Edit: Es stellt sich heraus, dass das Problem nicht vorzeitige Freigabe überhaupt war. Es war ein Umstellungsproblem. Danke allen für Ihre Hilfe.

@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

Welche momorialen Attribute verwenden Sie für Ihre Eigenschaften? – Matthias

+0

Veröffentlichen Sie Ihre Kopfzeile, niemand kann feststellen, wie Sie die Eigenschaften von dem, was Sie gepostet haben, definiert haben. – Sam

+0

Testen Sie Ihre App mit dem Zombies-Gerät. Dadurch erhalten Sie die vollständige Retain/Release-Historie eines Objekts, das zu oft freigegeben wurde. –

Antwort

2

Was wäre ein guter Weg, um sicherzustellen, dass die Eigenschaften meines Objekts nicht vorzeitig freigegeben werden.

Festhalten an ihnen durch Beibehaltung einer starken Referenz. Es ist äußerst unwahrscheinlich, dass ARC Ihre Daten nach dem Zufallsprinzip freigibt. Viel wahrscheinlicher ist, dass du es loslässt, wenn du es nicht willst.

Der erste Ort, an dem ich nachsehen würde, ist die Verwendung von setCurrentGame:. Stellen Sie sicher, dass Sie nicht versehentlich in verschiedenen Teilen des Programms gleichzeitig an verschiedenen Game Objekten arbeiten. Zuerst, stellen Sie sicher t

Ihre +get... Methoden sind ungeschickt benannt (ein get Präfix bedeutet eine sehr spezifische Sache in ObjC, und es ist nicht, was Sie hier tun). Havards Klassenmethoden, die Ziele und Aktionen wie diese annehmen, scheinen ein Problem zu sein. Ich frage mich, was da drinnen vorgeht.

Ihre Konvertierung zwischen zwei Arten von User Objekte ist ein wenig verdächtig, und ich würde sicherstellen, dass Sie nicht versehentlich User oder PFUser Objekte fallen lassen, wenn Sie nicht wollen.

Im Allgemeinen ist diese Frage jedoch zu vage. Sind Sie am Ende mit starken Zeigern? Sind Ihre starken Zeiger scheinbar nil? Wird Ihr Spielobjekt selbst nil? Woher weißt du, wann Dinge "veröffentlicht" werden? Oder meinst du, dass sie sich entziehen? Haben Sie in dealloc einen Haltepunkt gesetzt, um zu sehen, wer die letzte Referenz auf das Objekt hatte?

+0

Es gibt kein Dealloc für das Objekt. Du hast recht mit dem + bekommen ..Benutzerobjekt von PFUser dient dazu, einen Wrapper um ein Datenobjekt zu erstellen, das zu einem späteren Zeitpunkt möglicherweise mit einem anderen SDK oder Dienst ausgetauscht wird. Sie haben auch Recht, das ist über vage. Die Getter geben ein int von einem Datenobjekt (PFObject) zurück. Wenn ich einen intValue in meinem Getter als GameStatus Enum zurückgebe, wird die Variable (null). –

+0

Sie können jederzeit ein 'dealloc' hinzufügen, um darauf zu protokollieren oder einen Breakpoint zu setzen. Welche Variable wird "null"? intValue darf nicht null sein. Und meinst du es wird "wird" null beim Aufruf von intValue (es war vorher nicht null, und dann ist null)? Oder meinst du etwas anderes? Ich vermute, es gibt noch viel mehr zu graben, um genau festzustellen, was wann passiert. –

+0

Eigentlich habe ich die Frage bearbeitet, um festzustellen, dass das Problem gelöst wurde. Es stellt sich heraus, dass ich einen dummen Fehler gemacht habe und versuchte, einen intValue eines Objekts zurückzugeben, das keine NSNummer war. Das Design der Klasse ist schlecht und das Erstellen von Posts und das Debuggen ist problematisch. Ich schätze Ihre Hilfe. Danke für den Dealloc-Tipp. Ich bin sehr neu in ARC. –

0

Stellen Sie sicher, Ihre Eigenschaften (behalten) Typ (gleich wie stark, glaube ich), und halten Sie jemals eine Instanz in der AppDelegate (so dass ARC sieht die Referenz als gültig für die gesamte Abwicklung Ihrer Programm).

+0

ARC lässt nicht zu behalten. –

+0

ARC erlaubt behalten als Eigenschaft Attribut. Es ist ein Synonym für stark. –

+0

Das ist richtig, aber es erlaubt kein Zurückhalten auf einem int, da es kein Objekt ist. –