我正在尝试使用 objc/runtime 将我的类中的所有变量保存到 NSUserDefaults
中。下面是我正在使用的代码。
NSUInteger count;
Ivar *iVars = class_copyIvarList([self class], &count);
for (NSUInteger i=0; i<count; i++)
{
Ivar var = iVars[i];
NSString *varName = [NSString stringWithCString:ivar_getName(var) encoding:NSUTF8StringEncoding];
NSString *varType = [NSString stringWithCString:ivar_getTypeEncoding(var) encoding:NSUTF8StringEncoding];
if([varType hasPrefix:@"["])
{
NSLog(@"Array");
id var1 = [_manager valueForKey:varName];
NSLog(@"--- %@", var1);
NSData *data = [NSData dataWithBytes:&([_manager valueForKey:varName]) length:sizeof([_manager valueForKey:varName])]
[[NSUserDefaults standardUserDefaults] setObject:[_manager valueForKey:varName] forKey:varName];
}
else
{
NSLog(@"NonArray");
NSLog(@"--- %@", [_manager valueForKey:varName]);
[[NSUserDefaults standardUserDefaults] setObject:[_manager valueForKey:varName] forKey:varName];
}
}
free(iVars);
问题是,当只有原始数据类型时,上面的代码工作得很好。但是,当我尝试访问像 int[]
或 float[]
这样的数组变量时,它因 SIGABRT
而崩溃。它没有显示任何其他消息。
valueForKey
不返回 C 数组的任何值。
如果有人知道如何在运行时为 C 数组加载值,请提供帮助。
提前致谢
苏然
最佳答案
除非你总是提供成对的长度方法,否则你的程序永远不会知道返回数组的长度。所以...您需要在某个地方做一些工作才能在不发生崩溃的情况下完成此任务。
如果我真的想做你正在做的事情,我会让类自己创建数组,提供 NSData
。如果这很常见,您可能需要使用约定:
- (int*)pixelBuffer;
- (NSData *)pixelBufferForSerialization; // << returns a deep copy of
// self.pixelBuffer as an
// NSData instance.
所以您上面的实现会看到该属性定义了一个标量数组,然后请求 NSData * data = obj.pixelBufferForSerialization;
而不是尝试自己生成数据。
更新
最好让类(class)来做。以下是使用此类数组创建 NSData
的方法:
@interface DataManager : NSObject
{
@private
int* things;
size_t nThings;
}
- (int*)things;
- (NSData *)thingsAsNSData;
@end
@implementation DataManager
- (int*)things
{
return things;
}
- (NSData *)thingsAsNSData
{
// note: you may need to choose an endianness for serialization
if (0 == nThings) return [NSData data];w
return [NSData dataWithBytes:things length:nThings * sizeof(things[0])];
}
@end
同样 - 您希望类创建数据,因为它最了解自己的结构。
关于iphone - 使用 Objective-C 运行时访问 C 数组(int[]、float[] 等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8531805/