[Obj-C] Functie aanroepen in zelfde Class

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Depress
  • Registratie: Mei 2005
  • Laatst online: 18-09 22:29
Hallo,

De vraag is heel simpel, en ik had zelf ook niet verwacht hem te moeten stellen(3 Jaar programmeer ervaring in PHP/C#/VB.NET/Delphi). Maar objective c is een heel andere slag.

Ik heb 2 functies, vanuit functie loginUser wil ik functie setStoredCredentials aanroepen.
Ze zijn beide als volgt gedeclareerd:
C:
1
2
- (int) loginUser: (NSString*)Usr :(NSString*)Pswd;
- (int) setStoredCredentials;


Nu met mijn geringe kennis heb ik het volgende geprobeerd:
C:
1
2
[setStoredCredentials];//Dit geeft een error bij compile, logisch er is geen object om deze message naar toe te sturen
[self setStoredCredentials]; //Dit geeft in runtime een bad_acces aan. 


Met zoeken op google vind ik het niet. Hier worden alleen messages aan andere objecten behandeld. Het lijkt me ZEER sterk dat het niet kan in objective c..

Wie heeft een idee hoe dit aan te pakken?

Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 10-08 02:59

Gerco

Professional Newbie

De syntax die je gebruik is correct, dit moet prima werken. Die bad access krijg je waarschijnlijk omdat je iets doet als een stale pointer dereferencen.

Dit zou bijvoorbeeld kunnen komen omdat je 'self' object al released is (je released ergens de pointer naar je object, maar roept er wel een functie op aan). Met autorelease kan je dat gebeuren voor je het door hebt :)

[ Voor 8% gewijzigd door Gerco op 17-06-2009 16:11 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

  • Depress
  • Registratie: Mei 2005
  • Laatst online: 18-09 22:29
Vreemd, ik heb nergens autorelease mee gegeven aan de functie.

Het is misschien doordat de automagische garbage collecter van ObjC2.0 hier zich er mee bemoeit?
Ik zal eens de functie tot de bodem uitzoeken. Er hangen links en rechts nog wat spulletjes aan..

Bedankt voor de input.

Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 10-08 02:59

Gerco

Professional Newbie

Niet alleen autorelease kan dit veroorzaken, het is alleen wel vaak de oorzaak van dit soort problemen. De garbage collector heb ik persoonlijk nog nooit gebruikt dus ik heb geen idee hoe release en autorelease zich in die omgeving gedragen.

Waarschijnlijk zijn het beiden no-ops en werkt het geheel onafhankelijk van de retain/release commands. In dat geval moet je het ergens anders zoeken. Kan het natuurlijk nog steeds een stale pointer zijn :)

Heb je in je "init" wel dit gedaan?
C:
1
2
3
4
5
6
7
- (id) init {
  if(self = [super init]) {
    // Meer code
  }

  return self;
}


Die enkele = is geen typo! Dat is de default vorm van een NSObject subclass init method. Als je dat niet op die manier doet kan er van alles misgaan (zoals een niet of verkeerd gezette "self" pointer ofzo...).

Ik geloof dat "self" wel automagisch gezet wordt, maar als je rare code in je init hebt staan kun je de self pointer misschien wel slopen... wat tot dit probleem zou leiden.

[edit]
Blijkbaar is het niet altijd een goed idee om self = [super init] te schrijven zoals zowat alle Objective-C documentatie aanraad... zie ook http://www.wilshipley.com/blog/2005/07/self-stupid-init.html

[ Voor 45% gewijzigd door Gerco op 17-06-2009 16:27 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!