private static void logRetainRelease(long cls, long self, int count, boolean isRetain) { String className = ObjCClass.getFromObject(cls).getType().getName(); System.err.println(String.format("[Debug] %s %s@0x%s, retain count: %d", isRetain ? "Retained" : "Released", className, Long.toHexString(self), isRetain ? count + 1 : count - 1)); } }
@MarshalsPointer public static Class<? extends ObjCObject> toObject(Class<ObjCClass> cls, long handle, long flags) { ObjCClass o = ObjCClass.toObjCClass(handle); if (o == null) { return null; } return o.getType(); } @MarshalsPointer
if (!expectedType.isAssignableFrom(objCClass.getType())) {
/** * Creates a new instance of the specified {@link ObjCClass}. If * {@code makePeer == true} this method MUST be called while the * {@link #objcBridgeLock} is held. */ @SuppressWarnings("unchecked") private static <T extends ObjCObject> T createInstance(ObjCClass objCClass, long handle, int afterMarshaledFlags, boolean makePeer) { Class<T> c = (Class<T>) objCClass.getType(); T o = VM.allocateObject(c); o.setHandle(handle); if (makePeer) { setPeerObject(handle, o); } if (objCClass.isCustom()) { VM.setBoolean(VM.getObjectAddress(o) + CUSTOM_CLASS_OFFSET, true); } o.afterMarshaled(afterMarshaledFlags); return o; }
@Callback private static @Pointer long retain(@Pointer long self, @Pointer long sel) { int count = ObjCRuntime.int_objc_msgSend(self, retainCount); if (count <= 1) { synchronized (CUSTOM_OBJECTS) { ObjCClass cls = ObjCClass.toObjCClass(ObjCRuntime.object_getClass(self)); ObjCObject obj = ObjCObject.toObjCObject(cls.getType(), self, 0); CUSTOM_OBJECTS.put(self, obj); } } long cls = ObjCRuntime.object_getClass(self); if (logRetainRelease) { logRetainRelease(cls, self, count, true); } Super sup = new Super(self, getNativeSuper(cls)); return ObjCRuntime.ptr_objc_msgSendSuper(sup.getHandle(), sel); }
private static void logRetainRelease(long cls, long self, int count, boolean isRetain) { String className = ObjCClass.getFromObject(cls).getType().getName(); System.err.println(String.format("[Debug] %s %s@0x%s, retain count: %d", isRetain ? "Retained" : "Released", className, Long.toHexString(self), isRetain ? count + 1 : count - 1)); } }
@MarshalsPointer public static Class<? extends ObjCObject> toObject(Class<ObjCClass> cls, long handle, long flags) { ObjCClass o = ObjCClass.toObjCClass(handle); if (o == null) { return null; } return o.getType(); } @MarshalsPointer
@Callback private static String parseClassName(ObjCClass self, @Pointer long selector) { Class<?> clazz = self.getType(); ParseClassName annotation = clazz.getAnnotation(ParseClassName.class); return annotation.value(); }
if (!expectedType.isAssignableFrom(objCClass.getType())) {
/** * Creates a new instance of the specified {@link ObjCClass}. If * {@code makePeer == true} this method MUST be called while the * {@link #objcBridgeLock} is held. */ @SuppressWarnings("unchecked") private static <T extends ObjCObject> T createInstance(ObjCClass objCClass, long handle, int afterMarshaledFlags, boolean makePeer) { Class<T> c = (Class<T>) objCClass.getType(); T o = VM.allocateObject(c); o.setHandle(handle); if (makePeer) { setPeerObject(handle, o); } if (objCClass.isCustom()) { VM.setBoolean(VM.getObjectAddress(o) + CUSTOM_CLASS_OFFSET, true); } o.afterMarshaled(afterMarshaledFlags); return o; }