2011-07-11 21 views
28

Estoy siguiendo "Programación en Objective-C" 3 rd edición y estoy teniendo problemas con el primer ejemplo.NSAutoreleasePool no está disponible

me siguen dando este error:

Semantic Issue: 'NSAutoreleasePool' is unavailable: not available in automatic reference counting mode

Aquí está mi código:

// 
// main.m 
// prog1 // 
// Created by Steve Kochan on 1/30/11. 
// Copyright 2011 ClassroomM, Inc.. All rights reserved. // 

#import <Foundation/Foundation.h> 
int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    NSLog (@"Programming is fun!"); 
    [pool drain]; 
    return 0; 
} 

será muy apreciada Cualquier penetración.

+2

Por favor, ver si se puede leer su propia pregunta - el código debe marcarse como código – Mark

+2

¿No es la vista previa de Lion bajo NDA? – Caleb

+0

No puede hacer esta pregunta aquí todavía porque Lion SDK está bajo NDA. –

Respuesta

39

Se solicita al compilador que compile el archivo con el ARC (recuento automático de referencias) habilitado. A su vez que fuera o, mejor aún, modernizar su ejemplo:

int main (int argc, const char * argv[]) { 
    @autoreleasepool { 
     NSLog (@"Programming is fun!"); 
    } 
    return 0; 
} 

(No, no puedo decirle cómo, específicamente, para apagar ARC, si ésa era la ruta que se va a ir hacia abajo debido a la NDA antes mencionado)

+0

¡Muchas gracias! Muy apreciado. – Greg

+1

Tu comentario "moderniza tu ejemplo" me tiene preocupado-- Yo también estoy comenzando el mismo libro mencionado en la pregunta original, si el primer ejemplo en el libro está haciendo algo "desactualizado" ¿vale la pena continuarlo o debo mirarlo? para un nuevo libro? – chrixian

+1

El conocimiento todavía es aplicable. Incluso con ARC, sigue siendo útil comprender los detalles de retención/liberación manual. Diablos, incluso si solo tiene la intención de escribir una aplicación de iOS, aún se beneficiará al conocer otros idiomas. Pero, sí, el libro documenta patrones que ya no son los más modernos. – bbum

3

Aquí está una link a la guía de transición de Apple a ARC.

OK ... marque this fuera. Cambio específico en NSAutoreleasePool: así es como Xcode se inicializa cuando creas tu primera aplicación. No sé ustedes, ¡pero me encanta esta idea!

No te preocupes si sigues el libro de w/Kochan. Al comenzar su proyecto, simplemente desmarque la casilla "Usar ARC". Todo funcionará.

16

Mensaje rápido en caso de que todavía mirando

Puede desactivar ARC en configuración de generación.

  • Haga clic en su proyecto, en el organizador de la izquierda.
  • Seleccione su objetivo, en la siguiente columna.
  • Seleccione Configuración de compilación pestaña en la parte superior.
  • vaya a "Objective-C de la cuenta automática de referencia" (que puede ser catalogado como "CLANG_ENABLE_OBJC_ARC" bajo las ajustes definidos por el usuario grupo), (si no encuentra la opción de ARC en la configuración crea, es posible necesita para alternar tu compilador. Puedes encontrarlo en la configuración de compilación)
  • y configúralo en NO.
+0

Esto lo arregló para mí en OS X Lion - ¡Gracias Jason! – Anthony

+0

Su respuesta funciona excelente. –

-1

ARC se habilita la primera vez que crea un nuevo proyecto. De acuerdo, sé que la única forma en que sé cómo habilitar o no habilitarla es la primera vez que creas tu programa. Es una de las casillas de verificación que debe deseleccionar.

+0

¿La respuesta de @JasonRogers es incorrecta cuando dice cómo desconectar el ARC? – Mark

5

En mi caso, quería ARC activado, y quería actualizar un proyecto de muestra para que funcione correctamente. Los documentos de NSAutoReleasePool de Apple son técnicamente correctos, pero no vean directamente y expliquen esto.Así es como:

Lleva tu principal de la aplicación, lo que probablemente se ve algo como esto:

int main(int argc, char *argv[]) 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    int retVal = UIApplicationMain(argc, argv, nil, NSStringFromClass([DemoAppDelegate class])); 

    [pool release]; 

    return retVal; 
} 

y el cambio a este aspecto:

int main(int argc, char *argv[]) 
{ 
    @autoreleasepool { 
     return UIApplicationMain(argc, argv, nil, NSStringFromClass([DemoAppDelegate class])); 
    } 
} 
Cuestiones relacionadas