2012-05-25 25 views
5

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.

Respuesta

6

memorytype es significativo solo cuando @synthesize accede a su propiedad. Dado que está proporcionando su propia implementación tanto para getter como para setter, las cosas que pone entre paréntesis después de @property se ignoran; Normalmente pongo readonly o readwrite allí, solo para recordarme qué tipo de acceso está disponible en estas propiedades.

Su código es correcto, funcionará sin crear problemas de memoria con o sin ARC.

Cuestiones relacionadas