2013-08-28 4 views
0

У меня есть структуры в моей Objective-C код, как это>Objective-C свойства Struct высвобождаются перед использованием

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.

+1

Я не понимаю, какова цель этой структуры. Почему это не объект или вложенный массив. Какую выгоду вы получаете от того, что это структура, с которой вы начинаете? Также вы можете получить к ним доступ сразу после создания правильно, в основном вы уверены, что их инициализация начинается? –

ответ

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
  • вы можете определить удобные методы в классе
  • это более идиоматических объективно- C wise
+0

Да, в объективе-c кажется очень странным использовать структуру для управления памятью. –

+0

Не так уж странно, есть много примечательных примеров, как и весь «Core Foundation». Однако эволюция языка направлена ​​на более высокие уровни абстракций. ARC сделала большой шаг в этом направлении, поэтому лучше вскочить на поезд и начать модернизацию устаревшего кода. –

+0

Спасибо, Да, использование объектов довольно простое и правильный способ сделать это. Мне было очень любопытно, как в этом случае выполнять ручную обработку памяти для структур. Это не было направлено на производительность, а скорее на любопытство :) – nsuinteger

Смежные вопросы