iphone - 使用 Objective-C 运行时访问 C 数组(int[]、float[] 等)

标签 iphone objective-c ios arrays runtime

我正在尝试使用 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/

相关文章:

ios - 向 iOS 中的工具提示添加不属于图表的 x&y 轴的其他数据

ios - 在 iOS 上,0x0000000000000026、0x000000000000001c、0x000000000000005a 是标记指针的示例吗?

ios - 找不到支持 10 型键盘 iPhone-Portrait-Emoji 的键平面

ios - Apple ResearchKit 导致 Missing Info.plist key

iPhone - UIView 内的 UIScrollView 不滚动

iphone - 添加编译后ITK奇怪的错误

objective-c - Xcode 4.2和ARC的iOS AVAudioPlayer双重声音播放问题

android - 我可以在 android 中使用为 ios 创建的 sqlite 数据库吗?

iphone - iOS : Movement Precision in 3D Space

iphone - 在 Web 服务之前加载 UITableViewController