2012-07-02 12 views
5

avevo bisogno di fare un UIAlertView per la mia app, e mi sono imbattuto in this articolo che descrive come farlo. Da allora ho apportato alcune modifiche, ma il fatto più importante rimane che questa classe non funziona come un avviso "Fuoco e dimentica", come fa lo UIAlertView, perché ARC non consente di chiamare retain."Fuoco e dimenticare" di classe in ARC

Quindi, fondamentalmente, voglio essere in grado di utilizzare la mia vista avviso personalizzato allo stesso modo di un normale visualizzazione degli avvisi, quindi posso creare e visualizzare uno come questo:

CustomAlertView *alert = [[CustomAlertView alloc] init];//Init presumably does the view setup 
[alert show]; 

Quindi la mia domanda è, come posso ottenere questo oggetto di non deallocare non appena esce dall'ambito quando si lavora in un progetto ARC, senza creare un riferimento strong ad esso nella classe chiamante?

EDIT

Suppongo che sia importante ricordare, che, al fine di ottenere la piena libertà di vista personalizzazione che volevo, ho dovuto fare questo una nuova classe ViewController, è NON una sottoclasse di UIAlertView

EDIT 2

mi dispiace, non ho guardare il mio legame troppo da vicino, ho avuto il tutorial sbagliato legata in origine. THIS è il tutorial corretto che ho basato la mia vista su

+0

[show] esegue il dump del conteggio ref, quindi la variabile locale non è più l'unica maniglia dell'oggetto. Fuoco e dimentica. –

+0

Non è una sottoclasse, il suo nuovo controller di visualizzazione può essere istanziata da un pennino, o da una scena storyboard –

+0

UIAlertView funziona aggiungendo un altro 'UIWindow' sulla gerarchia della finestra, il che rende UIWindow in grado di mantenerlo. Prova a simulare questo comportamento nella tua applicazione. –

risposta

0

Dovrai fare un forte riferimento all'istanza della sottoclasse mentre è necessaria. Si potrebbe fare questo, ad esempio, presentando il proprio oggetto in un controller di visualizzazione (poiché la gerarchia del controller di visualizzazione è mantenuta fortemente) o avendo un riferimento a livello di classe a tutte le istanze della classe che sono ancora necessarie.

+0

Cosa intendi esattamente per "riferimento a livello di classe"? –

+0

Voglio dire, ad esempio, una variabile statica nel tuo file .m che punta a un NSMutableArray di istanze "in uso" della tua classe. (Avrai quindi bisogno di un meccanismo per le tue istanze che si registrino e si cancellino dalla lista.) –

+0

Vedo, questo è un modo per aggirare il divieto di ARC sulle chiamate a 'retain' –

1

Se si desidera simulare il modo in cui funziona UIAlertView, è necessario creare un nuovo oggetto UIWindow, inizializzarlo correttamente e visualizzarlo utilizzando [window makeKeyAndVisible]. Fai attenzione che questo sarà presente, ma non mantieni la finestra. Se il conteggio dei riferimenti della finestra scende a zero, la finestra viene rimossa dallo schermo.

si vuole creare deliberatamente un ciclo di mantenere, che si interrompe una volta che l'alertview è respinto.

I.e. la tua classe customalertview crea e conserva uno UIWindow e lo UIWindow mantiene la sottoview: la tua classe customalertview. Quindi, rilasciando lo UIWindow, la finestra rilascerà la tua customalertview.

+0

Ho il display che sta accadendo giusto , Mi sto solo chiedendo come posso ottenere che l'oggetto non si distrugga da solo una volta che esce dall'ambito –

+1

Come ho detto, è necessario introdurre un ciclo di conservazione. In un progetto, l'ho risolto sottoclassando 'UIWindow', e conservando un oggetto controller che manteneva la finestra. Una volta che la finestra decide che è finita ('self.controller = nil'), o il controller lo fa (' self.window = nil') il ciclo è rotto e tutto è deallocato. – mvds