我的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因此。
答案 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
在许多观点下更好: