【问题标题】:NSCoding a c struct object which is property of a classNSCoding 一个 c 结构对象,它是一个类的属性
【发布时间】:2015-08-03 22:23:41
【问题描述】:

我有一个名为 Account 的类,它有 6 个属性,其中一个属性是 c 结构。我不知道如何使用 NSCoding 来遵守结构。我将如何对 c struct 属性进行编码和解码。该结构是 ap​​p_config_t 类型。

结构

typedef struct app_config_t
{
    pj_pool_t               *pool;

    pjsua_config            cfg;
    pjsua_logging_config    log_cfg;
    pjsua_media_config      media_cfg;

    pjsua_transport_config  udp_cfg;
    pjsua_transport_config  rtp_cfg;


    pj_bool_t               ringback_on;
    pj_bool_t               ring_on;

    int                     ringback_slot;
    int                     ringback_cnt;
    pjmedia_port            *ringback_port;

    int                     ring_cnt;
    SystemSoundID           ring_id;
    CFRunLoopTimerRef       ring_timer;
} app_config_t;

一个名为“Account”的 Objective-C 类,其属性为 App_config

#pragma mark - NSCoding
- (void) encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:self.Username forKey:@"username"];
    [aCoder encodeObject:self.Password forKey:@"password"];
    [aCoder encodeObject:self.Server forKey:@"server"];

    [aCoder encodeInt:self.Account_id forKey:@"Account_id"];
    [aCoder encodeInt:self.Call_id forKey:@"Call_id"];

    //trying to save this object, is this even correct
    NSMutableData *data = [NSMutableData dataWithBytes:&_App_config length:sizeof(app_config_t)];
    NSKeyedArchiver *App_config_Archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    [aCoder encodeObject:App_config_Archiver forKey:@"App_config"];
}

- (id)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super init])
    {
        self.Username = [aDecoder decodeObjectForKey:@"username"];
        self.Password = [aDecoder decodeObjectForKey:@"password"];
        self.Server = [aDecoder decodeObjectForKey:@"server"];

        self.Account_id = [aDecoder decodeIntForKey:@"Account_id"];
        self.Call_id = [aDecoder decodeIntForKey:@"Call_id"];

        self.App_config = ?????????

    }

    return self;
}

【问题讨论】:

    标签: ios struct nscoding


    【解决方案1】:

    您当前的编码有错误。您为NSKeyedArchiver 提供的可变数据被归档器用于存储编码数据。所以复制app_config_t结构是没用的。

    您需要使用NSKeyedArchiver 对结构的每个字段进行编码。它具有原始类型的编码器。同样在app_config_t 结构中,我看到不是原始类型而是复杂类型的字段。所以你也需要对这些字段进行自定义编码。

    - (void) encodeWithCoder:(NSCoder *)aCoder
    {
        [aCoder encodeObject:self.Username forKey:@"username"];
        [aCoder encodeObject:self.Password forKey:@"password"];
        [aCoder encodeObject:self.Server forKey:@"server"];
    
        [aCoder encodeInt:self.Account_id forKey:@"Account_id"];
        [aCoder encodeInt:self.Call_id forKey:@"Call_id"];
    
        // this data will have encoded structure
        NSMutableData *data = [NSMutableData data];
        NSKeyedArchiver *App_config_Archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    
        // for all fields from structure you need to use such encoders
        [App_config_Archiver encodeBool:_App_config.ringback_on forKey:@"ringback_on"];
    
        // encode data itself
        [aCoder encodeObject:data forKey:@"App_config"];
    }
    

    【讨论】:

      【解决方案2】:

      您应该能够将结构视为内存缓冲区并使用 NSCoder 的encodeBytes function 来执行此操作:

      - (void)encodeBytes:(const void * _Nullable)byteaddr length:(NSUInteger)length

      【讨论】:

      • 他在结构中有几个指针字段。如果您只是将结构编码为内存块,则可能会出现问题。
      猜你喜欢
      • 1970-01-01
      • 2018-12-31
      • 1970-01-01
      • 1970-01-01
      • 2019-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-04
      相关资源
      最近更新 更多