2011-12-19 13 views
3

私は多くの記事をオンラインで読んでいますが、私はARCについて少し混乱しています。私は下の質問をリストアップします、私はそれらに答えるのを助けてください。ARCと解放メモリ

1)キーワードstrongは()@property (nonatomic, strong) …に何をしますか?

2.)私はまたはautorelease私たちはallocというよりも、もう必要がないと警告しています。 (私は私のMacではないですので、私は私が得た警告をコピーすることはできません。)

3)私はXcodeの4.2でのリークツールを見つけることができませんでした。それはどこに行きましたか?それとも、漏れをチェックする必要はありませんか?

4.)Xcode 4.2を使用してプロジェクトを作成する際、「ARCを有効にする」をクリックしたので、私のプログラムはiOS 3で動作しますか? (私は、ARCのみ上記のiOS 4とをサポートしていと思います。)

+1

は、個別の質問として、これらを投稿してください。 – Jim

+0

私は彼らがすべて関連していると思います。 – sharon

+0

ティムの答えは非常に良いですが、あなた自身の利益のために、まだドキュメントを読むべきです。 –

答えて

6
  1. 強いが、ARCでretainに相当します。 What does the "strong" keyword do

  2. はありません、それはあなたのために行われています:それは所有権を示しています。 ARCはそれらのステートメントを(コンパイルされた)コードに自動的に挿入します。それがその主な仕事です。しかし、Abizernのコメントによると、これはあなたのオブジェクトとCocoaオブジェクトでのみ機能します。あなたがコア基盤(CF*)クラスを使用している場合は、__bridgeキャストのファミリについて読む必要があります。 You might start reading here.

  3. インスツルメントです。 iHunterの回答、Cmd + IまたはProduct-> Profileに従って、[Leaks]を選択します。特に重要です(2)。

  4. これは動作しません。

+1

+1。 #2に関しては、警告を受けるべきではありません。エラーが発生しているはずです。 'release'を使う必要はありません。あなたは 'release'を使わないでください。 –

+0

まだ漏れをテストする必要がありますか? ARCがメモリを解放している場合、なぜ漏れをテストする必要がありますか? – sharon

+1

ARCはCocoaオブジェクトのみを処理します。 Core Foundationオブジェクトを使用している場合は、メモリ管理を使用する必要があります。フリーダイヤルのブリッジを使用する場合、オブジェクトの所有権を移転するためのルールがあります。 ARCはメモリ管理を廃止するものではなく、より一般的な部分をより簡単かつ効率的にするだけです。だから、はい、まだ漏れをチェックする必要があります。 – Abizern

7
  1. strongretainにARCアナログ(ARCの下に何retainがありません)です。それは、@propertyが定義されたクラスによってプロパティ値が保持され、再割り当てまたは解放時に解放されることを意味します。 (ARCの下では、deallocのプロパティを解放したり無効にする必要はありません。

  2. ARCのポイントは、コンパイラによってルーチンであるretain/releaseの世話をしているので、手動のメモリ管理方法は必要ありません。

  3. あなたはプロフィール(Product -> Profileメニュー)を実行し、リーク機器を選択することで、漏れをチェックすることができます。漏れは、循環参照またはCoreFoundationコードで導入できます(ARCはCoreFoundationでは機能しません)。また、ARCコードと非ARCコードを混在させている場合は、後者がリークの原因となる可能性があります。

  4. ARCはiOS 4.0以降のOSでサポートされています(iOS 5 SDKが必要です)。 4.0と5.0のARCサポートの主な違いは、weakプロパティ指定子の可用性です。弱いプロパティ(__weak変数)は、それが参照する値strongが解放されると自動的に無効になります。 4.0にweakのプロパティがないので、__unsafe_unretained指定子を使用する必要があります(これはassign指定子に近いですが、値を保持せず、すでに割り当て解除された値を指すこともあり危険です)。ここで

はARCの偉大な説明です: Everything you need to know about automatic reference counting

+0

ARCはiOS4.3以降でサポートされています(4.0ではなく)。 – Abizern

+0

ARCはCoreFoundationで動作しないため、CFコードにリークが発生する可能性があります。また、ARCコードと非ARCコードを混在させる場合は、後者がソースになる可能性があります。 – iHunter

+0

@Abizernありがとう、私は私の答えを固定しました – iHunter

2

まあ、私はここでは、単一の詳細に焦点を当てますので、主なものをカバー3つの答えがすでに存在し、それは、すでに言及されていません。

3.)Xcode 4.2ではリークツールが見つかりませんでした。それはどこに行きましたか? また、漏れを確認する必要はありませんか?

はい、我々はまだ漏れをチェックする必要があります:

ARCは、ガベージコレクションではありません、/解除を保持自動化されています。

したがって、実際には、リークを作成するのはかなり簡単です。

は、次の例を考えてみましょう:

@class Puppet; 
@protocol PuppetDelegate : <NSObject> 
- (void)puppetDidTwistStrings:(Puppet *)puppet; 
@end 

@interface Puppet : NSObject { 
    id <PuppetDelegate> delegate_; 
} 

- (id)initWithPuppetDelegate:(id <PuppetDelegate>)delegate; 
- (void)unravelStrings; 

@end 

@implementation Puppet 
- (id)initWithPuppetDelegate:delegate 
{ 
    if (!(self = [super init])) return nil; 

    delegate_ = delegate; 

    return self; 
} 

// assume some implementation for unravel strings 

@end 

@interface MasterOfPuppets : NSObject <PuppetDelegate> { 
    NSMutableArray *puppets_; 
} 

- (void)puppetDidTwistStrings:(Puppet *)puppet; 
- (void)bringOutAPuppet; 

@end 

@implementation 
- (id)init 
{ 
    if (!(self = [super init])) return nil; 

    puppets_ = [[NSMutableArray alloc] init]; 

    return self; 
} 

- (void)bringOutAPuppet 
{ 
    Puppet *newPuppet = [[Puppet alloc] initWithPuppetDelegate:self]; 
    [puppets_ addObject:newPuppet]; 
} 

- (void)puppetDidTwistStrings:(Puppet *)puppet 
{ 
    BOOL isOurPuppet = [puppets_ containsObject:puppet]; 
    if (!isOurPuppet) return; 

    [puppet unravelStrings]; 
} 
@end 

この例では、(確かに)少し愚かですが、このコードは漏れるだろう、とARCは、ガベージコレクションのに対し、それについてあなたを助けるために考えつもりはない。

  • MasterOfPuppetsは多くの人形を持つことができます。人形はインスタンス変数に格納されています。
  • パペットには、その文字列がエンタングルしているかどうかを知らせるデリゲートがあります。ここで開始します。

非ARCのコードでインスタンス変数は、単純に割り当てられたポインターたARCは、変数で何かを隠しておくならば、あなたはそれにしがみつくしたいと仮定し、それがない限り、値をretainますのに対しあなたはと言わないでください。

ここでは古典的なリテンションサイクルがあり、ARCはそれを保存しません。

これは、人為的で遠すぎる例のように見えるかもしれませんが、そうではありません。私はこれをデリゲート関係でかなり見たことがあります。

(ソリューションは、方法によって、非常に単純です:weakとしてPuppetdelegate_インスタンス変数を宣言し、すべてはそれが必要として動作します。)

+0

正直なところ、この問題(循環参照漏れ)はGC環境でも存在します。 GCがどのリンクを最初に破るかを決めるのは難しいです。 – iHunter

関連する問題