1

ヘッダーファイルでオブジェクトが定義されています:

@property (nonatomic, retain) UIBarButtonItem *printButton;

実装ファイル

@synthesize printButton;

self.printButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(printWebPage:)];
[self.view addSubview:printButton];
[printButton release]; // Should I release it here?

- (void)dealloc
{
  [printButton release];
  [super dealloc];
}

私の質問は、私はそれの後に常に release/autoreleaseオブジェクト(retainプロパティとして宣言されている)をすべきaddSubviewであり、他の関数で使用する場合でも、deallocでそれを解放する必要がありますか?!

4

3 に答える 3

4

propertyasがある場合retain、新しい値を保持releaseし、古い値にメッセージを送信します。また、でreleaseこのプロパティを実行する必要がありdeallocます。

正しい方法はこれを行うことです:

self.printButton = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(printWebPage:)] autorelease];

またself.view addSubView、サブビューを保持し、スーパービューがそれを解放する責任があります。

于 2013-03-23T19:26:55.613 に答える
3

保持するためには、オブジェクトを少なくとも1回は保持する必要があります。複数回は許容されますが、キーは少なくとも1回です。保持することで、「これを利用できるようにする必要があります」と言い、リリースすることで、「もう必要ありません」と言います。たとえば、割り当てが解除された後、必要以上に物事を保持することは失礼で無駄です。そうすることはリークです。

あなたの特定の質問に:あなたの財産が保持されている場合、はい、あなたはある時点で解放しなければなりません。あなたdeallocの時間は大丈夫です、またはあなたが所有する何かによってそれが再び保持された後はさらに良い時間です。サブビューにビューを追加すると、保持されている配列にオブジェクトが追加されます(UIViewスーパークラスはサブビューの配列を保持します)。配列自体はその要素を保持します。したがって、追加した直後のリリースは適切です。

さらに、サブビュー配列を知っていて、その内容が生涯保持されるため、コピーをまったく保持しない方がさらにクリーンです。これが、サブビューアウトレットが通常弱いと宣言される理由です。だから私は次のことをします:

@property(nonatomic, weak) UIBarButtonItem *printButton;

次に、initで:

UIBarButtonItem *aPrintButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(printWebPage:)];
// this is just a stack variable, retained because of the alloc
[self.view addSubview:aPrintButton];  // this provides a second retain
self.printButton = aPrintButton;      // this does not retain because it's setter is declared weak
[aPrintButton release]; // release here subtracts one retain, leaving the one you need

UIViewサブクラスはサブビュー配列NSArrayの解放を処理し、要素の解放を処理するため、サブクラスに明示的な解放は必要ありません。

于 2013-03-23T19:41:31.170 に答える
2

オブジェクトが不要になったときはいつでも(もちろんARCを使用していない場合は)オブジェクトを解放する必要があります。あなたの場合、ビューが追加されると、それへの参照はもう必要ありません(そのような場合にクラスでそれを使用するつもりでない限り、それを解放しないでください)。

@AndrewMadsenがコメントで述べたように、所有している参照を持つオブジェクトを解放します(明示的に保持するか、、、、、またはメソッドを使用newして参照を取得します)。copymutableCopyalloc

あなたはここでより多くの情報を見つけることができます

于 2013-03-23T19:05:53.357 に答える