www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Can't get Objective-C class method to compile.

reply Jeremie Pelletier <jeremiep gmail.com> writes:
Hello, I'm trying out the new interface to Objective-C and I 
can't get this to compile:

     module main;

     extern (Objective-C) {
         interface NSObject {
             void release()  selector("release");
         }

         interface NSString : NSObject {
             const(char)* UTF8String()  selector("UTF8String");
         }

         interface NSProcessInfo : NSObject {
             static NSProcessInfo processInfo() 
 selector("processInfo");

             NSString operatingSystemVersionString()
                  selector("operatingSystemVersionString");
         }
     }


     void main() {
         import std.stdio;

         auto str = 
NSProcessInfo.processInfo.operatingSystemVersionString;
         writeln(str.UTF8String);
         str.release();
     }

I used the following command line:

 dmd main.d -L-framework -LFoundation
I'm running the latest dmd (2.069.2) and it exits after printing this message:
 Assertion failed: (ethis), function 
 objc_callfunc_setupMethodCall, file objc_glue.c, line 276.
 Abort trap: 6
This is from the class method call to NSProcessInfo.processInfo. I've tried without the selector but get a linker error on __D4main13NSProcessInfo11processInfoYZC4main13NSProcessInfo. I'm not sure if it is a bug or if I'm not using it correctly so I'm asking here before opening a bug report :)
Dec 30 2015
parent reply Jacob Carlborg <doob me.com> writes:
On Thursday, 31 December 2015 at 03:43:58 UTC, Jeremie Pelletier 
wrote:

 This is from the class method call to NSProcessInfo.processInfo.

 I've tried without the selector but get a linker error on 
 __D4main13NSProcessInfo11processInfoYZC4main13NSProcessInfo.

 I'm not sure if it is a bug or if I'm not using it correctly so 
 I'm asking here before opening a bug report :)
D doesn't support Objective-C classes methods yet. But as a workaround you can look how it's done with the "alloc" method in the documentation [1]. Declare the method as a non-static method but use the result from "objc_lookUpClass" as the receiver (object). [1] http://dlang.org/spec/objc_interface.html#usage-example
Dec 31 2015
parent Jeremie Pelletier <jeremiep gmail.com> writes:
On Thursday, 31 December 2015 at 08:56:07 UTC, Jacob Carlborg 
wrote:
 D doesn't support Objective-C classes methods yet. But as a 
 workaround you can look how it's done with the "alloc" method 
 in the documentation [1]. Declare the method as a non-static 
 method but use the result from "objc_lookUpClass" as the 
 receiver (object).

 [1] http://dlang.org/spec/objc_interface.html#usage-example
Oh, that's good to know! Thanks for the tip :) I'll definitely keep an eye out for the rest of Objective-C support. Adding it was a fantastic idea :)
Dec 31 2015