6

iOS 4から、iVarをまったく宣言しない機能が追加され、プロパティを合成するときにコンパイラが自動的にiVarを作成できるようになったことを理解しています。ただし、この機能に関するAppleのドキュメントは見つかりません。

また、iVarとプロパティの使用に関するベストプラクティスまたはAppleが推奨するガイドラインに関するドキュメントはありますか?私はいつも次のようなプロパティを使用しています:

.hファイル

@interface myClass {
    NSIndexPath *_indexPath
}

@property(nonatomic, retain) NSIndexPath *indexPath

@end

.mファイル

@implementation myClass

@synthesize indexPath = _indexPath;

- (void)dealloc {
    [_indexPath release];
}
@end

iVar名としてindexPathの代わりに_indexPathを使用して、を使用するindexPath必要があるときに使用しないようにしていますself.indexPath。しかし、iOSが自動プロパティをサポートするようになったので、それについて心配する必要はありません。ただし、iVar宣言を省略した場合、deallocでのリリースをどのように処理する必要がありますか?プロパティメソッドを使用するのではなく、deallocでリリースするときにiVarsを直接使用するように教えられました。設計時にiVarがない場合、代わりにプロパティメソッドを呼び出すことはできますか?

4

3 に答える 3

6

私はこれに対処するために多くの異なる方法を経験してきました。私の現在の方法は、dealloc でプロパティ アクセスを使用することです。プロパティに奇妙な動作があることがわかっている場合を除いて、そうしない理由は(私の考えでは)あまりにも不自然です。

@interface Class
@property (nonatomic, retain) id prop;
@end

@implementation Class
@synthesize prop;

- (void)dealloc;
{
    self.prop = nil;
    //[prop release], prop=nil; works as well, even without doing an explicit iVar
    [super dealloc];
}
@end
于 2011-03-17T18:59:09.870 に答える
5

対照的に、私は次のことを行います。

@interface SomeViewController : UIViewController

@property (nonatomic, copy) NSString *someString;

@end

その後

@implementation SomeViewController

@synthesize someString;

- (void)dealloc
{
    [someString release], someString = nil;
    self.someString = nil; // Needed?

    [super dealloc];
}

@end

注: ある時点で、Apple は @synthesize ディレクティブを必要としないデフォルトでの合成を有効にする予定です。

于 2011-03-17T18:59:53.930 に答える
3

->ドットの代わりにシンボルを使用して、インスタンス変数に直接アクセスできます.(これにより、ivar の対応するアクセサ メソッドが呼び出されます)。

.h

@interface myClass {
}
@property(nonatomic, retain) NSIndexPath *indexPath

@end

.m

@implementation myClass

- (void)dealloc {
    [self->indexPath release];
    self->indexPath = nil; // optional, if you need it

    [super dealloc];
}
@end

したがって、対応するアクセサ メソッドではなくiVarに直接アクセスし、パフォーマンスという追加の利点を得ることができます。

于 2011-03-17T18:41:13.677 に答える