从 JSON 设置后立即释放模型属性

Posted

技术标签:

【中文标题】从 JSON 设置后立即释放模型属性【英文标题】:Model property immediately deallocated after being set from JSON 【发布时间】:2014-12-26 02:04:16 【问题描述】:

在我的模型上设置 NSString 属性后,它会立即作为 Null 返回。奇怪的是,设置任何 typedef 属性都会被保留(即 NSInteger)。代码如下。我也通过 GCD 运行此方法,但我对此进行了注释并且它没有改变任何东西。我在模型中也有一些 NSCoding 方法,但是注释掉委托并没有改变任何东西。

实际上一切正常,包括访问 JSON dict 和 NSLogging 结果,除了设置我的模型属性不是 typedef。

更新

将任何 NSString 分配给 [dictionary valueForKey:@"first_name"] 会返回 Null,很明显这是访问字典的问题。

更新 2

记录字典后,我注意到有些键没有“”,有些值没有“”。我正在使用 rails 中的 as_json,而在邮递员 chrome 扩展中,这不会发生


available = 1;
boxing = 0;
certificates = "";
city = A;
"created_at" = "2014-12-14T07:23:35.445Z";
description = "Short description";
"drivers_license" = CA12345;
"drivers_license_expiration" = "12/20";
"drivers_license_state" = CA;
email = "test4@aol.com";
"facebook_id" = "";
"first_name" = TEsty;
gender = "";
id = 1;
"last_name" = Again;
latitude = "<null>";
longitude = "<null>";
password = g;
pilates = 0;
"reset_password_token" = "<null>";
running = 0;
strength = 0;
"updated_at" = "2014-12-25T08:42:27.122Z";
yoga = 0;

.h 文件

@interface FSTrainer : NSObject <NSCoding>

@property (nonatomic) NSInteger id;
@property (nonatomic, strong) NSString* first_name;
@property (nonatomic, strong) NSString* last_name;

- (id) init;
- (id) initWith:(NSMutableDictionary *)dictionary;

等等。

.m 文件

-(id)init
 self = [super init];
 if (!self) return nil;
 return self;


- (id) initWith:(NSMutableDictionary *)dictionary

 self = [super init];
 if (!self) return nil;


  if ([dictionary valueForKey:@"id"] != [NSNull class])
    self.id = [[dictionary valueForKey:@"id"] integerValue];

  if ([dictionary valueForKey:@"first_name"] != [NSNull class])
    
        [self setFirst_name:[dictionary valueForKey:@"first_name"]];

        NSLog(@"%@", [dictionary objectForKey:@"first_name"]);
        NSLog(@"%@", [dictionary valueForKey:@"first_name"]);
        //Both NSLogs print out the correct names

  if ([dictionary valueForKey:@"last_name"] != [NSNull class])
    self.last_name = [valueForKey objectForKey:@"last_name"];

 etc.... 

return self;

这是被调用的:

    dispatch_async(dispatch_get_global_queue(0, 0), ^
        [self computationForRails];
    );

还有功能

-(void)computationForRails
...
    FSTrainer* currentTrainer = [[FSTrainer alloc] initWith:[tempdict    valueForKey:@"data"]];
    //sol-added JNKeychian
    [JNKeychain saveValue:currentTrainer forKey:@"current_trainer"];

其中 tempdict 等于(数据是字典中的键)

    id jsonObject = [NSJSONSerialization JSONObjectWithData: data
                                                    options: NSJSONReadingMutableContainers
                                                      error: &error];

稍后我在哪里访问模型(我保存的模型没有正确设置其属性,所以这是应用程序崩溃的地方

    FSTrainer* current_trainer = [JNKeychain loadValueForKey:@"current_trainer"];
    NSString* trainerName = current_trainer.first_name;

【问题讨论】:

你怎么知道财产被释放了?你能展示一下这个作品吗? @AaronBrager 它没有被释放。当我仍在调试问题时,我发布了。该属性永远不会被设置。我试图将临时 NSString 设置为字典值,它返回 null。但是当我 nslog 键(first_name)的值时,它会正确注销。我假设它是设置字典的方式。查看我的更新,我会尝试更新标题 什么意思?属性设置器是void 方法。您能说明您是如何尝试访问该变量的吗? @AaronBrager 抱歉-我想说的是,在将属性设置为等于 [dictionary valueForKey:@"first_name"] 之后,它返回 null。但是,当我 NSLog(%@, [dictionary objectForKey:@"first_name"]) 记录正确的字符串时。真的很奇怪。查看我返回的字典 json。有些键有“”,有些则没有。价值观也是如此。 带有空格或特殊字符的键和值有引号。这很正常——这就是字典和数组的打印方式。 【参考方案1】:

替换你的代码

[self setFirst_name:[dictionary valueForKey:@"first_name"]];

使用此代码

[self setFirst_name:[NSString stringWithFormat:@"%@",[dictionary valueForKey:@"first_name"]]];

对我有用

【讨论】:

节日快乐!不幸的是,这不起作用,尽管当我 NSlogged 时它确实注销了正确的值。这很奇怪。 @DaynaJuliana - 你能把你的代码分享给我吗?所以,我可以通过调试你的代码来检查问题。 实际上这确实适用于其他奇怪的值。问题是我如何访问它们。谢谢!

以上是关于从 JSON 设置后立即释放模型属性的主要内容,如果未能解决你的问题,请参考以下文章

单击按钮后立即执行 SwiftUI 按钮操作,而不是单击释放

postgresql数据库使用DELETE命令删除数据后,空间是不是立即自动释放?

sigsegv 发生在 posix_memalign 在某些设备中释放后立即发生并在 AIX 中编译选项

初始化后直接释放内容视图控制器的弹出框

c# topmost模式窗口关闭后,有“无法访问已释放的对象”错误

为啥有时会立即释放内存,而有时仅在自动释放池耗尽时才释放内存?