web-dev-qa-db-ja.com

ARCは、「保持」問題の明示的なメッセージ送信を禁止しています

私は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を使用しています

13
Kir

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

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

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

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

44
MrHappyAsthma

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

  1. CIImageからCGImageRefに画像を取得するためのメソッドを作成したファイルは次のとおりです。

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

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

  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];
       }
      
1
Anny