まあ、私はここでは、単一の詳細に焦点を当てますので、主なものをカバー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
としてPuppet
のdelegate_
インスタンス変数を宣言し、すべてはそれが必要として動作します。)
は、個別の質問として、これらを投稿してください。 – Jim
私は彼らがすべて関連していると思います。 – sharon
ティムの答えは非常に良いですが、あなた自身の利益のために、まだドキュメントを読むべきです。 –