0

次のクラスについていくつか質問があります

#import <Cocoa/Cocoa.h>

@interface SomeObject {
    NSString *title;
}

@property (retain) NSString *title;

@end




   implementation SomeObject

    @synthesize title;

    -(id)init {
        if (self=[super init])
        {
            self.title=[NSString stringWithFormat:@"allyouneed"];
        }

        return self;
    }

-(void)testMethod{
self.title=[[NSString alloc] init] ;
}

    -(void)dealloc {
        self.title=nil;

        [super dealloc];
    }
  1. .h ファイルでは、プロパティを追加するときにタイトルとサブを宣言する必要がありますか。@property (retain) NSString *title; を追加するだけでは不十分ですか? ライン。

2.init と testMethod でタイトルへの割り当てを両方とも自動解放する必要がありますか。では、なぜですか?

誰かが私にこれらのことを説明できますか.

4

4 に答える 4

2

1- ヘッダーで iVar を宣言する必要はありません。あなたも使うかもしれません

@synthesize myVar = _myVar;

別の iVar 名を使用する場合

2-プロパティを「保持」と宣言すると、プロパティに新しいオブジェクトを割り当てるたびに、以前のオブジェクトが自動的に解放され、新しいオブジェクトが保持されます。

したがって、stringwithFormat のような便利なメソッドを使用すると、プロパティはそのオブジェクトを保持します。

alloc-init を使用する場合、私にとって最善の方法は次のとおりです。

NSString *str = [NSString alloc] init];
self.title = str;
[str release];

また、dealloc でプロパティに nil を割り当てるのは正しいことです。なぜなら、プロパティはそれが持っているオブジェクトを解放し、retain on nil を呼び出して何もしないからです。

于 2012-06-13T09:48:54.230 に答える
0

イニシャライザ メソッドおよび dealloc メソッドでアクセサ メソッドを使用することは、良い方法とは見なされないことに注意してください。この回答を確認してください:なぜ init/dealloc で Objective C 2.0 アクセサーを使用すべきではないのですか?

また、Apple のメモリ管理ガイド: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html

于 2012-06-13T10:36:50.123 に答える
0

1. .h でタイトルを宣言する必要はありません。プロパティを宣言するだけで十分です。

2.init で self.title を使用している場合は、自動解放する必要はありません。ただし、testMethod で初期化する場合は、プロパティを保持として宣言しているため、自動解放する必要があります。また、タイトルを解放することを忘れないでください解放します。

于 2012-06-13T09:40:48.130 に答える
0
  1. 自動的に行われるため、追加する必要はありません(Xcode 4以降だと思います)。

  2. init-すでにオブジェクトを返しているので、そうではありませんautoreleased..

testMethodあなたがそれを割り当てているので、あなたがする必要がある場所..

alloccopyまたはnew.... AMEN..を使用して作成したオブジェクトは常に解放する必要があります:)

于 2012-06-13T09:41:27.323 に答える