13

私はAppleガイドからのこの非常に単純なコードを使用しています:

NSMutableData *receivedData;

// Create the request.
NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.apple.com/"]
                        cachePolicy:NSURLRequestUseProtocolCachePolicy
                    timeoutInterval:60.0];
// create the connection with the request
// and start loading the data
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (theConnection) {
    // Create the NSMutableData to hold the received data.
    // receivedData is an instance variable declared elsewhere.
    receivedData = [[NSMutableData data] retain];
} else {
    // Inform the user that the connection failed.
}

しかし、その行のreceivedData = [[NSMutableData data] retain];Xcodeは私にエラーを与えます:PushController.m:72:25: ARC forbids explicit message send of 'retain'

どのように対処しますか?Xcode4.4.1を使用しています

4

3 に答える 3

44

現在、ARC を使用してカウントを参照しています。(ARC は、iOS 5 の新機能である「自動参照カウント」です)。したがって、手動で保持または解放する必要はありません。次の手順を実行して、retain 呼び出しをすべて削除するか、ARC をオフにすることができます。

左側のナビゲーション ビューでプロジェクトの名前をクリックし、[ターゲット] -> [ビルド フェーズ] に移動-fno-objc-arcして、関連ファイルの「コンパイラ フラグ」に追加します。

削除についてはこちらをご覧ください。

ARCの基本情報はこちらをご覧ください。

于 2012-08-09T05:01:04.350 に答える
1

以下のように問題を解決しました。コードは Objective-C 用です。

  1. CIImage から CGImageRef に画像を取得する方法を記述したファイル:

    CGImageRef cgImage = [_ciContext createCGImage:currentImage fromRect:[currentImage extent]];
    

    そのファイルを非ARCとして作成します。Project -> BuildPhase -> ComplieSources -> Your File -> add "-fno-objc-arc"to your file に移動します。

  2. プロジェクトに .pch ファイルがある場合は、次の行コメントを作成します。

    #if !__has_feature(objc_arc)
    #error This file must be compiled with ARC.
    #endif
    
  3. 次の関数を使用して画像を作成するために使用されるメソッドに移動します。

    CGImageRef cgImage = [_ciContext createCGImage:currentImage fromRect:[currentImage extent]];
    

    次のように _ciContext を宣言します。

    1. .h ファイルで、次のように宣言します。

      @property (strong, nonatomic)   CIContext* ciContext;
      
    2. メソッドで、コンテキストを作成します。

      EAGLContext *myEAGLContext = [[EAGLContext alloc]
              initWithAPI:kEAGLRenderingAPIOpenGLES2];
      _ciContext = [CIContext contextWithEAGLContext:myEAGLContext      options:nil];
      
    3. イメージの作成には _ciContext を使用します。

    4. 同じファイルに次のメソッドを記述します。

       -(void)dealloc
       {
          [super dealloc];
          [EAGLContext setCurrentContext:nil];
       }
      
于 2016-09-01T03:52:28.083 に答える
-1

ARCをオンまたはオフにすることは、プロジェクトレベルの設定です。両方のモードで機能するコードが必要な場合は、使用する必要があります。

#if __has_feature(objc_arc)
//dont do a release or a retain or autorelease
#else
//do the release
#endif
于 2012-08-09T05:14:03.290 に答える