Pregunta

Estoy construyendo una aplicación para iPad, que hace que las páginas de texto de un NSAttributedString. Creo un framesetter como esto:

- (void)renderTextFromAttributedString:(NSAttributedString *)string
{
    CFAttributedStringRef attrString = (CFAttributedStringRef)string;
    framesetter = CTFramesetterCreateWithAttributedString(attrString);
    CFRelease(attrString);

... entonces el código añade nuevas páginas vistas, una por una, y pasa el puntero framesetter fuera a cada uno para representar cada página, hasta que no quedan caracteres:

- (void)drawNewPage
{
    CTSinglePageView *newPage = [[CTSinglePageView alloc] initWithFrame:newFrame];
    newPage.delegate = self;
    [newPage renderWithFramesetter:framesetter fromIndex:currentIndex margins:self.margins];
    [self addSubview:newPage];
    [newPage release];
    currentPage ++;

... etc etc Ahora todo esto funciona muy bien, haciendo que las páginas y que muestra el texto con formato a la perfección. Sin embargo, al final del proceso de render, todavía tengo un CTFramesetter que necesita limpieza, para que pueda construir el siguiente conjunto de páginas. Sin embargo, si lo hago

    if(framesetter) CFRelease(framesetter);

al final del proceso, el CTFramesetter se libera (obviamente) y el programa se bloquea! PERO ... Si no suelta el framesetter, eventualmente llegar a ser muy grandes pérdidas de memoria y el programa rescata.

¿Por qué está causando la liberación de un accidente? Con NSZombieEnabled activada, el mensaje de error que consigo es:

  

* - [liberación NSConcreteAttributedString]: mensaje enviado a la instancia desasignado 0xed20270

Cualquier ayuda dada es recibida por supuesto en gran medida! Actualmente estamos en contra de una fecha límite aquí, si pudiera añadir una recompensa ahora lo haría! Cualquier persona con una buena respuesta será recompensado una recompensa después de que haya transcurrido la ventana 2 días : -).

¿Fue útil?

Solución

¿Está seguro que se supone que la liberación de attrString? Eso no se ve bien. Me pregunto si que está causando el accidente más tarde, cuando la liberación de framesetter.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top