Esto es para una aplicación que permite a los usuarios etiquetar cosas. Las etiquetas son solo cadenas.¿Semántica de memoria de una propiedad de matriz calculada?
Una matriz de objetos TagHolder
contiene una lista de todas las etiquetas en uso en la aplicación, con un booleano que indica si la etiqueta está seleccionada, pero este es un detalle de implementación.
La interfaz externa requiere dos métodos, selectedTags
y setSelectedTags:
que devuelven y aceptan un conjunto de cadenas.
Me gustaría que estos dos métodos funcionen como descriptores de acceso para una propiedad declarada selectedTags
.
Ahora, mi pregunta es:
Cuál sería la semántica de gestión de memoria correctas para declarar para esa propiedad?
El patrón de código que tengo en mente es la siguiente (código no probado, así que tenga con errores tipográficos):
@interface TagInfo : NSObject
@property (strong, nonatomic) NSString *tag;
@property (nonatomic) BOOL selected;
@end
@interface SomeClass : NSObject
@property (memorytype, nonatomic) NSArray *selectedTags;
@end
@implementation TagHolder
- (NSArray *)selectedTags
{
// tagInfoArray is an array of all TagInfo objects
NSPredicate *selPred = [NSPredicate predicateWithFormat: @"selected == YES"];
NSArray *selectedTagInfoObjects = [[self tagInfoArray] filteredArrayUsingPredicate: selPred];
NSArray *selectedTags = [selectedTagInfoObjects valueForKey: @"tag"];
return selectedTags;
}
- (void)setSelectedTags: (NSArray *)selectedTags
{
for (TagInfo *tagInfo in [self tagInfoArray]) {
tagInfo.selected = [selectedTags containsObject: tagInfo.tag];
}
}
@end
Lo que debería ser memorytype
? Obviamente no es fuerte o débil, pero creo que podría ser cualquiera de assign
, copy
o incluso unsafe_unretained
, pero ¿cuál es el más correcto para una propiedad calculada con un valor de objeto?
Normalmente uso ARC, pero supongo que la pregunta es la misma en un entorno con recuento de retención manual.