JSON RPC Module: Strange gc-problems
Monkey Targets Forums/iOS/JSON RPC Module: Strange gc-problems
| ||
| Hey monks ;) I'm currently playing around and trying to build a JSON RPC Client Module for Monkey that wraps https://github.com/samuraisam/DeferredKit Here is my code so far (please note that you have manually add the Classes-Directory to your xcodeproject):
#import "Classes/JSONRPCService.h"
class JSONServiceWrapper : public gxtkObject {
public:
void call(String endpoint, String method, Array<String> params = NULL);
virtual void onDataLoaded(String response);
virtual void onDataFailed(String err);
};
@interface JSONService : NSObject <JSONRPCServiceDelegate>
{
@public
void (JSONServiceWrapper::*callbackOnSuccess) (String);
void (JSONServiceWrapper::*callbackOnFail) (String);
JSONServiceWrapper *jInstance;
NSString *response;
JSONRPCService* svc;
}
-(void) call:(String)endpoint withMethod:(String) method andParams:(NSArray*) params;
-(void) onDataLoaded:(String) data;
-(void) onFailed:(String) err;
@end
void JSONServiceWrapper::call(String endpoint, String method, Array<String> params) {
JSONService *s = [[JSONService alloc] init];
s->callbackOnSuccess = &JSONServiceWrapper::onDataLoaded;
s->callbackOnFail = &JSONServiceWrapper::onDataFailed;
s->jInstance = this;
[s call:endpoint.ToNSString() withMethod:method.ToNSString() andParams:nil];
}
void JSONServiceWrapper::onDataLoaded(String response) {
}
void JSONServiceWrapper::onDataFailed(String response) {
}
@implementation JSONService
#pragma mark -
#pragma mark JSONRPCServiceDelegate
-(void) dataLoaded:(NSData*)data {
response = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];
if (callbackOnSuccess && jInstance)
(jInstance->*callbackOnSuccess)(String(response));
}
-(void) loadingFailed:(NSString*) errMsg {
if (callbackOnFail && jInstance)
(jInstance->*callbackOnFail)(String(response));
}
-(void) call:(String)endpoint withMethod:(String) method andParams:(NSArray*) params {
jInstance->onDataLoaded("Start Call");
[svc release];
svc = [[JSONRPCService alloc] initWithURL:[NSURL URLWithString:endpoint.ToNSString()]];
svc.delegate = self;
if (!params)
params = [NSArray array];
[svc execMethod:method.ToNSString() andParams:[NSArray array] withID:@"1"];
}
@end
Now here is a small example program that works:
Import horizon.application
Import horizon.faderbrightness
Import horizon.scenesplashscreen
Import horizon.zone
Import horizon.util
Import horizon.arrayhelper
Import horizon.collision
Import horizon.touchcontroller
Import horizon.zone
Import soundmanager
Import scenegame
Import scenemarket
Import jsonservice.jsonservice
Class JSONW Extends JSONServiceWrapper
Method onDataLoaded:Void(response$)
Print response
End
Method onDataFailed:Void(response$)
Print response
End
End
Global j:JSONW
Function Main:Int()
Local app:Application = Application.GetInstance()
app.Init()
app.SetSize(960, 640)
app.AddFader(New FaderBrightness)
' app.AddScene("title", New SceneSplashScreen("gfx/title.png", 3000, "main"))
app.AddScene("main", New SceneGame)
app.AddScene("market", New SceneMarket)
j = New JSONW
j.call("http://xxxxxxxxxxx", "ping", [""])
app.Run()
Return 0
End
When I move the j-Object from global scope to local the app crashes, when it receives the callback:
(jInstance->*callbackOnSuccess)(String(response));
Do you see anything strange in my code which I shouldn't do? |