web-dev-qa-db-fra.com

NSAutoreleasePool n'est pas disponible

Je suis "Programmation en Objective-C" 3rd édition et j'ai des problèmes avec le premier exemple.

Je reçois toujours cette erreur:

Problème sémantique: 'NSAutoreleasePool' n'est pas disponible: non disponible en mode de comptage de référence automatique

Voici mon code:

//
// 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;
}

Tout aperçu sera grandement apprécié.

29
Greg

Le compilateur est invité à compiler le fichier avec ARC (comptage automatique des références) activé. Désactivez-le ou, mieux encore, modernisez votre exemple:

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

(Non, je ne peux pas vous dire comment, spécifiquement, désactiver ARC, si c'était la route que vous deviez emprunter en raison du NDA susmentionné.)

39
bbum

Publication rapide juste au cas où vous cherchez toujours

Vous pouvez désactiver ARC dans les paramètres de génération.

  • Cliquez sur votre projet, dans l'organiseur de gauche.
  • Sélectionnez votre cible, dans la colonne suivante.
  • Sélectionnez l'onglet Paramètres de construction en haut.
  • Faites défiler jusqu'à "Objective-C Automatic Reference Counting" (il peut être répertorié comme "CLANG_ENABLE_OBJC_ARC" sous le groupe de paramètres ser-Defined), (si vous ne trouvez pas d'option ARC sous les paramètres de construction, vous pourriez besoin de basculer votre compilateur. Vous pouvez le trouver dans les paramètres de construction)
  • et réglez-le sur NO.
16
Jason Rogers

Dans mon cas, je voulais que ARC soit activé et je voulais mettre à jour un exemple de projet pour qu'il fonctionne correctement. Les documents NSAutoReleasePool d'Apple sont techniquement corrects, mais ne vous expliquez pas tout de suite. Voici comment:

Prenez votre application principale, qui ressemble probablement à ceci:

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

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

    [pool release];

    return retVal;
}

Et changez-le pour ressembler à ceci:

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

Voici un lien vers le guide de transition d'Apple vers ARC.

OK ... vérifiez this out. Changement spécifique à NSAutoreleasePool - c'est ainsi que Xcode s'initialise lui-même lorsque vous créez votre première application. Je ne sais pas pour vous, mais j'adore cette idée!

Pas de soucis si vous suivez le livre de Kochan. Lors du démarrage de votre projet, décochez simplement la case "Utiliser ARC". Tout fonctionnera.

3
Gonzofan