从 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 中编译选项