@@ -36,17 +36,16 @@ internal enum ObjectSubclassManager {
3636 // with the runtime.
3737 let subclass : AnyClass = try self . makeSubclass ( for: object)
3838
39- // Then , set the created class on the object.
40- object_setClass ( object, subclass)
39+ // Finally , set the created class on the object.
40+ let previousClass : AnyClass ? = object_setClass ( object, subclass)
4141
4242 Interpose . log ( {
4343 let subclassName = NSStringFromClass ( subclass)
4444 let objectAddress = String ( format: " %p " , object)
4545 var message = " Created subclass: \( subclassName) for object \( objectAddress) "
4646
47- if let superclass = class_getSuperclass ( subclass) {
48- let superclassName = NSStringFromClass ( superclass)
49- message += " (was: \( superclassName) ) "
47+ if let previousClass {
48+ message += " (previously: \( NSStringFromClass ( previousClass) ) ) "
5049 }
5150
5251 return message
@@ -74,14 +73,18 @@ internal enum ObjectSubclassManager {
7473 let subclassName = self . uniqueSubclassName ( for: perceivedClass)
7574
7675 return try subclassName. withCString { cString in
76+ // Attempt to allocate a new subclass that inherits from the object’s actual class.
7777 guard let subclass: AnyClass = objc_allocateClassPair ( actualClass, cString, 0 ) else {
78- throw InterposeError . failedToAllocateClassPair (
79- class : perceivedClass ,
80- subclassName : subclassName
78+ throw InterposeError . subclassCreationFailed (
79+ subclassName : subclassName ,
80+ object : object
8181 )
8282 }
8383
84+ // Set the perceived class to make the runtime report the original type.
8485 class_setPerceivedClass ( for: subclass, to: perceivedClass)
86+
87+ // Register the subclass with the runtime.
8588 objc_registerClassPair ( subclass)
8689
8790 return subclass
0 commit comments