Documentation
¶
Overview ¶
Package objc is a low-level pure Go objective-c runtime. This package is easy to use incorrectly, so it is best to use a wrapper that provides the functionality you need in a safer way.
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Class ¶
type Class uintptr
Class is an opaque type that represents an Objective-C class.
func AllocateClassPair ¶
AllocateClassPair creates a new class and metaclass. Then returns the new class, or Nil if the class could not be created
Example ¶
package main import ( "fmt" "github.com/ebitengine/purego/objc" ) func main() { var class = objc.AllocateClassPair(objc.GetClass("NSObject"), "FooObject", 0) class.AddMethod(objc.RegisterName("run"), objc.NewIMP(func(self objc.ID, _cmd objc.SEL) { fmt.Println("Hello World!") }), "v@:") class.Register() var fooObject = objc.ID(class).Send(objc.RegisterName("new")) fooObject.Send(objc.RegisterName("run")) }
Output: Hello World!
func GetClass ¶
GetClass returns the Class object for the named class, or nil if the class is not registered with the Objective-C runtime.
func (Class) AddIvar ¶
AddIvar adds a new instance variable to a class. It may only be called after AllocateClassPair and before Register. Adding an instance variable to an existing class is not supported. The class must not be a metaclass. Adding an instance variable to a metaclass is not supported. It takes the instance of the type of the Ivar and a string representing the type.
Example ¶
package main import ( "fmt" "unsafe" "github.com/ebitengine/purego/objc" ) func main() { var class = objc.AllocateClassPair(objc.GetClass("NSObject"), "BarObject", 0) class.AddIvar("bar", int(0), "q") var barOffset = class.InstanceVariable("bar").Offset() class.AddMethod(objc.RegisterName("bar"), objc.NewIMP(func(self objc.ID, _cmd objc.SEL) int { return *(*int)(unsafe.Pointer(uintptr(unsafe.Pointer(self)) + barOffset)) }), "q@:") class.AddMethod(objc.RegisterName("setBar:"), objc.NewIMP(func(self objc.ID, _cmd objc.SEL, bar int) { *(*int)(unsafe.Pointer(uintptr(unsafe.Pointer(self)) + barOffset)) = bar }), "v@:q") class.Register() var barObject = objc.ID(class).Send(objc.RegisterName("new")) barObject.Send(objc.RegisterName("setBar:"), 123) var bar = int(barObject.Send(objc.RegisterName("bar"))) fmt.Println(bar) }
Output: 123
func (Class) AddMethod ¶
AddMethod adds a new method to a class with a given name and implementation. The types argument is a string containing the mapping of parameters and return type. Since the function must take at least two arguments—self and _cmd, the second and third characters must be “@:” (the first character is the return type).
func (Class) InstanceVariable ¶
InstanceVariable returns an Ivar data structure containing information about the instance variable specified by name.
func (Class) Register ¶
func (c Class) Register()
Register registers a class that was allocated using AllocateClassPair. It can now be used to make objects by sending it either alloc and init or new.
func (Class) SuperClass ¶
SuperClass returns the superclass of a class. You should usually use NSObject‘s superclass method instead of this function.
type ID ¶
type ID uintptr
ID is an opaque pointer to some Objective-C object
func (ID) SendSuper ¶
SendSuper is a convenience method for sending message to object's super
Example ¶
package main import ( "fmt" "github.com/ebitengine/purego/objc" ) func main() { super := objc.AllocateClassPair(objc.GetClass("NSObject"), "SuperObject", 0) super.AddMethod(objc.RegisterName("doSomething"), objc.NewIMP(func(self objc.ID, _cmd objc.SEL) { fmt.Println("In Super!") }), "v@:") super.Register() child := objc.AllocateClassPair(super, "ChildObject", 0) child.AddMethod(objc.RegisterName("doSomething"), objc.NewIMP(func(self objc.ID, _cmd objc.SEL) { fmt.Println("In Child") self.SendSuper(_cmd) }), "v@:") child.Register() objc.ID(child).Send(objc.RegisterName("new")).Send(objc.RegisterName("doSomething")) }
Output: In Child In Super!
type IMP ¶
type IMP uintptr
IMP is a function pointer that can be called by Objective-C code.
Example ¶
package main import ( "fmt" "github.com/ebitengine/purego" "github.com/ebitengine/purego/objc" ) func main() { imp := objc.NewIMP(func(self objc.ID, _cmd objc.SEL, a3, a4, a5, a6, a7, a8, a9 int) { fmt.Println("IMP:", self, _cmd, a3, a4, a5, a6, a7, a8, a9) }) purego.SyscallN(uintptr(imp), 105, 567, 9, 2, 3, ^uintptr(4), 4, 8, 9) }
Output: IMP: 105 567 9 2 3 -5 4 8 9
type Ivar ¶
type Ivar uintptr
Ivar an opaque type that represents an instance variable.