【问题标题】:objective-c struct properties are released before usage使用前释放objective-c结构属性
【发布时间】:2013-08-28 16:45:34
【问题描述】:

我的 Objective-C 代码中有一个这样的结构 >

typedef struct {
__unsafe_unretained NSString *string1;
__unsafe_unretained NSString *string2;
__unsafe_unretained NSString *string3;
__unsafe_unretained NSString *string4;
__unsafe_unretained NSString *string5;
.
.
.
__unsafe_unretained NSString *string10;

} MyStruct;

在我的模型类中,我将这些结构存储在声明的数组中

@property (nonatomic, strong) NSMutableArray *myStructArray;

我在运行时像这样在我的 .m 文件中构造它

NSMutableArray *myTempArray = [NSMutableArray array];
for (NSDictionary *jsonDict in jsonArray)
{
 MyStruct stringsStruct = parseWithDictionary(jsonDict);
 [myTempArray addObject:[NSValue value:&stringsStruct withObjCType:@encode(MyStruct)]];
}
myObject.myStructArray = myTempArray;

问题是当我在解析/构造内部对象后尝试访问它时,我收到了错误

-[CFURL length]: message sent to deallocated instance 

顺便说一下,这是我稍后访问属性的方式,

 MyStruct myStruct; 
[[myObject.myStructArray objectAtIndex:someIndex] getValue:&myStruct];
NSLog(@"%@",myStruct.string1); // << bam! crash

我该如何解决这个问题?有没有办法确保对象保持完整而不会解除分配,直到我完成它?我正在使用 ARC,因此无法使用 __unsafe_unretained 删除。

【问题讨论】:

  • 我不明白这个结构的目的是什么。为什么它不是对象或嵌套数组。从它作为一个结构开始,你会得到什么样的好处?你也可以在创建后直接访问它们,基本上你确定它们的初始化开始了吗?

标签: objective-c struct automatic-ref-counting


【解决方案1】:

您明确告诉 ARC 使用 __unsafe_unretained 让开,这是获取 struct 保存对象值的唯一方法。这并非没有代价:您需要支付内存管理费。

您必须使用CFRelease/CFRetain 手动保留/释放放置在结构中的任何对象,这非常容易出错。

让我强调一点:__不安全_unretained。名字不是随便取的。

我的建议是:停止使用结构并将它们转换为对象。

@interface MyClass : NSObject

@property (nonatomic, copy) NSString *string1;
@property (nonatomic, copy) NSString *string2;
...
@property (nonatomic, copy) NSString *string10;

@end

多角度看还是比较好的:

  • 您可以使用 ARC“免费”进行内存管理
  • 您可以在类中定义便捷方法
  • 它更符合 Objective-C 的习惯

【讨论】:

  • 是的,在objective-c中使用结构体来做内存管理似乎很奇怪。
  • 并不奇怪,有很多值得注意的例子,比如整个Core Foundation。然而,语言的发展正朝着更高层次的抽象发展。 ARC 朝着这个方向迈出了一大步,因此最好跳上火车,开始对遗留代码进行现代化改造。
  • 谢谢,是的,使用对象非常简单,而且是正确的方法。在这种情况下,我真的对如何对结构进行手动内存处理感到好奇。这不是为了提高生产力,而是为了好奇:)
  • @nsuinteger 不客气。如果您觉得答案对您有帮助,请考虑接受它;)
猜你喜欢
  • 1970-01-01
  • 2011-03-16
  • 1970-01-01
  • 1970-01-01
  • 2012-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-29
相关资源
最近更新 更多