如何从不同对象的C数组指针中获取所有对象?

How to get all objects from the C-array's pointer of different NSObjects?

我正在使用此方法获取具有类型编码的隐藏实例变量:[3@](所有对象都不同)

#if __has_feature(objc_arc)
#define GETADDRESS(X) (const char *)(__bridge const void *)(X)
#else
#define GETADDRESS(X) (const char *)(X)
#endif

- (void *)getIvarPointer:(NSString *)ivarName {
    Ivar ivar = [self getIvar:ivarName];
    return *(void **)(GETADDRESS(self) + ivar_getOffset(ivar));
}

来自 return 的指针是数组的第一个元素,我不知道如何访问下一个 members.Arithmetic 指针不适用于 NSObject。

- (void)pointerToArrayOBJC:(NSString *)ivarName {
    NSObject* firstElement = [self getIvarPointer:ivarName]; // NSDictionary
    NSObject* secondElement = *(n + 128) // Arithmetic on pointer to interface 'NSObject', which is not a constant size for this architecture and platform
}

我曾尝试使用 Swift 实现此功能,但由于容量错误,我收到了 EXEC_BAD:

extension UnsafeMutableRawPointer {
    func toArray<T>(to type: T.Type, capacity : Int, count: Int) -> [T] {
        return Array(UnsafeBufferPointer(start: bindMemory(to: type, capacity: capacity), count: count))
    }
}

func pointerToArraySwift(){
    let firstElement = touchDevice!.getIvarPointer("_reserved3")
    let array = firstElement?.toArray(to: NSObject.self, capacity: 128, count: 3)
}

解决方案很简单,您只需要创建与数组元素编号相同的包装结构。

typedef struct {
    void* first;
    ...
    void* last;
} reservedArray ;

- (reservedArray)getReservedArray:(NSString *)ivarName{
      Ivar ivar = [self getIvar:ivarName];
    return *(reservedArray *)(GETADDRESS(self) + ivar_getOffset(ivar));
}

- (reservedArray) trace:(NSString *)ivarName {
    return [self getReservedArray:ivarName];
 }