objc

package
v0.1.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 9, 2022 License: Apache-2.0 Imports: 7 Imported by: 3

Documentation

Rendered for darwin/amd64

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

func AllocateClassPair(super Class, name string, extraBytes uintptr) Class

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

func GetClass(name string) Class

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

func (c Class) AddIvar(name string, ty interface{}, types string) bool

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

func (c Class) AddMethod(name SEL, imp IMP, types string) bool

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

func (c Class) InstanceVariable(name string) Ivar

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

func (c Class) SuperClass() Class

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) Class

func (id ID) Class() Class

Class returns the class of the object.

func (ID) Send

func (id ID) Send(sel SEL, args ...interface{}) ID

Send is a convenience method for sending messages to objects.

func (ID) SendSuper

func (id ID) SendSuper(sel SEL, args ...interface{}) ID

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

func NewIMP

func NewIMP(fn interface{}) IMP

NewIMP takes a Go function that takes (ID, SEL) as its first two arguments. It returns an IMP function pointer that can be called by Objective-C code. The function pointer is never deallocated.

type Ivar

type Ivar uintptr

Ivar an opaque type that represents an instance variable.

func (Ivar) Offset

func (i Ivar) Offset() uintptr

Offset returns the offset of an instance variable that can be used to assign and read the Ivar's value.

For instance variables of type ID or other object types, call Ivar and SetIvar instead of using this offset to access the instance variable data directly.

type SEL

type SEL uintptr

SEL is an opaque type that represents a method selector

func RegisterName

func RegisterName(name string) SEL

RegisterName registers a method with the Objective-C runtime system, maps the method name to a selector, and returns the selector value.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL