如何从不同对象的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];
}
我正在使用此方法获取具有类型编码的隐藏实例变量:[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];
}