• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Das Monatsmotto Juli lautet -- Kitsch as Kitsch can -- Jeder von Euch kann dafür ganz individuell bestimmen, was für ihn Kitsch ist und ein Foto davon einsenden. Macht mit, traut Euch! --> Klick

Lebenszeit, Delegate Pattern macht Probleme

loha*

Alkmene
Registriert
24.01.10
Beiträge
32
<div class="bbWrapper">Hallo ich habe eine kleine App die über verschiedene View Controller verfügt . <br /> In dem root View wird ein Object erzeugt , eine Methode von diesem Object wird über das Delegate Pattern von einem anderen View gefeiert. Nur leider findet der Aufruf nicht statt ich denke das Object ist dann schon aus dem Speicher gelöscht. Wie kann ich es im Speicher behalten ? <br /> <div class="bbCodeBlock bbCodeBlock--screenLimited bbCodeBlock--code"> <div class="bbCodeBlock-title"> Code: </div> <div class="bbCodeBlock-content" dir="ltr"> <pre class="bbCodeCode" dir="ltr" data-xf-init="code-block" data-lang=""><code>class RootViewController: UIViewController, NRFManagerDelegate, streamDelegate{ ...... let activeTests = ActiveTestViewController() func requestData(data: [UInt8]){ let nsData = NSData(bytes: data, length: data.count) if nrfManager.writeData(nsData) { print(&quot;send stream&quot;) requestStream = nsData communicationtimer = NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: #selector(timeoutForRequest), userInfo: nil, repeats: true) }else {print(&quot;send error&quot;)} } ......</code></pre> </div> </div><br /> <div class="bbCodeBlock bbCodeBlock--screenLimited bbCodeBlock--code"> <div class="bbCodeBlock-title"> Code: </div> <div class="bbCodeBlock-content" dir="ltr"> <pre class="bbCodeCode" dir="ltr" data-xf-init="code-block" data-lang=""><code>protocol streamDelegate{ func requestData(data: [UInt8]) } class ActiveTestViewController: UIViewController{ var delegate : streamDelegate? @IBAction func exhaustValveTest(sender: AnyObject) { print(&quot;exhaustValveTest&quot;) let stream = request.DeviceTest(requestTyps.DFFI2.testMode.ExhaustValve) delegate?.requestData(stream) } .....</code></pre> </div> </div><br /> Schon mal denke <img src="/community/styles/apfeltalk/smilies/SmilingCheeks.png" class="smilie" loading="lazy" alt=":)" title="Smile :)" data-shortname=":)" /></div>
 

ecco55

Tokyo Rose
Registriert
26.10.14
Beiträge
71
<div class="bbWrapper">Ganz schnell und einfach. Nachdem du das Objekt erzeugst hast musst du angeben: <div class="bbCodeBlock bbCodeBlock--screenLimited bbCodeBlock--code"> <div class="bbCodeBlock-title"> Code: </div> <div class="bbCodeBlock-content" dir="ltr"> <pre class="bbCodeCode" dir="ltr" data-xf-init="code-block" data-lang=""><code> activeTests.delegate = self</code></pre> </div> </div> Damit sollte es gehen. Gruß, Daniel</div>
 

loha*

Alkmene
Registriert
24.01.10
Beiträge
32
<div class="bbWrapper">Sry , daran hab ich natürlich gedacht nur im Code schnippsel vergessen ...<br /> <br /> Sonst noch vorschläge ? Gruß</div>
 

KALLT

deaktivierter Benutzer
Registriert
12.11.08
Beiträge
1.523
<div class="bbWrapper">Wenn beide Objekte auf einander verweisen, dürfte das eigentlich nicht passieren. Wo genau instanzierst du denn die Variable <br /> activeTests und wann wird deren delegate-Eigenschaft gesetzt?<br /> <br /> Hast du schon versucht um mit deinit() herauszufinden ob und wann die Instanzen gelöscht werden?</div>
 

loha*

Alkmene
Registriert
24.01.10
Beiträge
32
<div class="bbWrapper">activeTests wird im Rootviewcontroller zugewiesen , das delegate wird in viewdidload gesetzt .<br /> Komisch komisch, &quot;deinit&quot; wird im RootviewController gar nicht aufgerufen daher muss das object noch am leben sein. Jetzt stellt sich die Frage was hier trotzdem schief läuft ....</div>
 
Zuletzt bearbeitet:

loha*

Alkmene
Registriert
24.01.10
Beiträge
32
<div class="bbWrapper">Ich bin mir gerade nicht sicher , aber kann es daran liegen das ich von einem in den anderen View peer Button spring über Segues show</div>