NSTimer + NSTask
26 juli 2005 - 02:27   
geplaatst door: Seth
Ik weet niet of hier wat Objective-C-developers zitten, maar ik probeer het eerst hier toch maar even.
Ik ben een paar weken bezig met Cocoa/Objective-C. Lukt goed tot nu toe.
Nu wil ik met een NSTimer om de 5 seconden een netstat-proces starten. Dat werkt met:

NSTimer *timer = [[NSTimer scheduledTimerWithTimeInterval: 5
  target: uiHandler
selector: @selector(refreshData:)
userInfo: nil
 repeats: YES] retain];
[timer fire];

refreshData start een task met startTask en haalt er dan wat gegevens uit. startTask:

- (void)startTask {
aTask = [[[NSTask alloc] init] retain];
pipe = [[NSPipe pipe] retain];
   handle = [[pipe fileHandleForReading] retain];

[aTask setStandardOutput: pipe];
   [aTask setLaunchPath: @"/usr/sbin/netstat"];
   [aTask setArguments: args];
   [aTask launch];

/* ... */

[aTask terminate];
[aTask release];
aTask = nil;

[pipe release];
pipe = nil;

[handle release];
handle = nil;
}

Alles werkt, maar de tweede keer dat startTask doorlopen wordt, krijg ik dit bij [aTask launch]:

Program received signal:  "EXC_BAD_ACCESS".

Unable to disassemble objc_msgSend_rtp.
Iemand?

NSTimer + NSTask
26 juli 2005 - 12:19    reactie #1
geplaatst door: BraboMac
Ik ben nog niet zo'n ervaren Cocoa programmeur, maar ik vind het volgende opvallend:

aTask = [[[NSTask alloc] init] retain];

Stel dat de retain counter op 0 stond. Doordat je een extra reatin toeveogt wordt die 2. Vervolgens staat in je code:

[aTask release];

Misschien moet je eens proberen of de retain achter de eerste aanroep weg te halen, of release te vervangen door dealloc (of een tweede release?  :music: ).

Voorlopig lijkt me de retain weghalen de beste (veiligste) optie.

(Bewerkt door BraboMac om 14:02, 26-07-2005)

Big Nerd Ranch blogs for Mac developers (and Nerds)
Er bestaan slechts 10 soorten mensen op deze aarde: Zij die binair kunnen rekenen en zij die dat niet kunnen.
NSTimer + NSTask
26 juli 2005 - 13:57    reactie #2
geplaatst door: Seth
De eerste retain verwijderen (stomme fout) of een tweede retain levert hetzelfde op En bij een dealloc krijg ik dezelfde fout op de regel van de dealloc.
Als mijn totaal alloc+retain gelijk is aan het aantal release, zou het toch moeten werken? :blink:

(Bewerkt door Seth om 14:08, 26-07-2005)

NSTimer + NSTask
26 juli 2005 - 14:06    reactie #3
geplaatst door: BraboMac
Ik zat er inderdaard naast. Ik bedoelde een tweede release (ik had daar tweede retain gezet, stom van me!).

Du zoiets zou het dan worden:

[aTask terminate];
[aTask release];
[aTask release];
aTask = nil;

Inderdaad moet het totaal alloc + retain gelijk zijn aan het aantal release.

Als dit nog steeds dezelfde output geeft zul je even op de Cocoa zwaargewichten van dit forum moeten wachten ben ik bang...

Big Nerd Ranch blogs for Mac developers (and Nerds)
Er bestaan slechts 10 soorten mensen op deze aarde: Zij die binair kunnen rekenen en zij die dat niet kunnen.
NSTimer + NSTask
26 juli 2005 - 14:09    reactie #4
geplaatst door: Seth
Een tweede release? :dontgetit: Zelfde resultaat als een dealloc.
Weird stuff als je het mij vraagt. :confused: