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.