objective-c struct属性在使用前发布

时间:2013-08-28 16:45:34

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

我的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&amp;无法删除__unsafe_unretained因此。

1 个答案:

答案 0 :(得分:2)

您明确告诉ARC使用__unsafe_unretained来避开它,这是获取结构保持对象值的唯一方法。这不是没有代价的:你支付内存管理费。

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

让我强调一点:__ UNSAFE _unretained。该名称尚未随机挑选。

我的建议是:停止使用结构并将它们变成对象。

@interface MyClass : NSObject

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

@end

在许多观点下更好:

  • 使用ARC
  • “免费”获得内存管理
  • 您可以在课程中定义便利方法
  • 这是更客观的Objective-C明智