0

ARCは、非ARC環境では通常見られない呼び出しを保持および解放することはありますか?

たとえば、ゲッターからオブジェクトを明示的に解放します。

- (NSArray *)dummyArray {
     return [[NSArray alloc]init];
}

- (void)useDummyArray {
    NSArray * arr = [self dummyArray];
    //do something with arr
    [arr release]; //unconventional injection of release.
}

ARCは上記のコードのようなリリースステートメントを生成するのでしょうか、それとも[selfdummyArray]によって返される配列を自動リリースするのでしょうか。

4

1 に答える 1

2

ARC の優れた点は、知らないこと、または知る必要がないことです。ただし、ARC 静的アナライザーにヒントを与えることができます。

 -(NSArray *) dummyArray NS_RETURNS_RETAINED { // this tells ARC that this function returns a retained value that should be released by the callee
      return [[NSArray alloc] init]; 
 } 

 -(NSArray *) otherDummyArray NS_RETURNS_NOT_RETAINED { // this tells ARC that the function returns a non-retained (autoreleased) value, which should NOT be released by the callee.
      return [[NSArray alloc] init];
 }

ただし、関数名がデフォルトになる でNS_RETURNS_NOT_RETAINED始まらない限り、がデフォルトです。initNS_RETURNS_RETAINED

したがって、特定のシナリオでは、ほとんどの場合、autorelease'd 値が返されます。これの主な理由の 1 つは、非 ARC コードでの補間のサポートであり、リークが発生する可能性があります。

于 2012-08-31T01:33:11.053 に答える