2011-12-26 16 views
0

私は、カスタムinitメソッドからオブジェクトをオートリリースする原理について少し混乱しています。例:カスタムinitメソッドでの自動解放

- (id)initWithId: (unsigned long)personID { 
    self = [super init]; 
    if (self) { 
     self.ID = personID; 
    } 

    return self; 
} 

objcコーディング規則に従って、返品時に自己を自己引き出しする必要があります。しかし、その種のコードは崩壊し続ける。私は何かを逃していますか?私はこれらのメソッドで手作業で作成したオブジェクトだけを自動リリースすべきですか? "self"ではなく、このようにしますか?

- (id)makeWithId: (unsigned long)personID { 
    Person *obj = [[Person init] alloc]; 

    if (obj) { 
     obj.ID = personID; 
    } 

    return [obj autorelease]; 
} 

ありがとうございます。ココアで

+1

呼び出しコードで返されているオブジェクトを保持していますか? – Abizern

+0

それは関係ありません=)それはすべてオートリリースの原則です。私が言っていることは: 'SomeClass sc = [SomeClass alloc] init];を呼び出すと、'私は間違いなく使用した後にscをリリースします。しかし、私が 'SomeClass sc = [[SomeClass alloc] initWithSomeParam:123]を呼び出すと、'私はそれを解放する必要はなく、私はそれに責任がない(initWithSomeParamは)。 – Stormherz

+4

@Stormherz、あなたは間違っています。あなたが 'alloc'を呼び出したならば、それを解放する責任があります。もしあなたが '[SomeClass someClassWithSomeParam:5]'を呼んでいれば、それはあなたの責任ではなく、オートリリースされています。 – joerick

答えて

3

、この慣習があります:allocまたはnew数+1

  • オブジェクト自動解放オブジェクトを返すを作成する他のすべてのメソッドを保持するオブジェクトを返すで始まる

    • メソッド。

    上記のinitメソッドでは、オブジェクトは作成されません。前のalloc呼び出しによってオブジェクトが作成されます。これはそれを設定し、使用の準備を整えます。

    makeWithIdメソッドについては、2つの概念を混同しています。このようなファクトリメソッドはクラスメソッドでなければなりません(つまり、-ではなく+と宣言してください)。次に、あなたはそれを使用します。

    Person *p = [Person makeWithId:3]; 
    

    これはそのまま、メソッド呼び出しの受信者とは異なるオブジェクトを返します。それはあなたが

    Person *p = [[Person alloc] makeWithId:3]; 
    

    を行う際allocで作成Personオブジェクトが漏洩してきた、とpが自動解放されることを意味します。

    要約すると、クラス 'factory'メソッドから自動解放されたオブジェクトを返し、initメソッドではメモリ管理を行いません。

  • +0

    arghhh、私はここに何も配っていない、私の空の頭、私はこの時間を過ぎていると確信しています=)ありがとう、それはすべて今、意味があります。 – Stormherz

    2

    何も割り当てないので、何かをリリースする必要はありません。

    作成時にオブジェクトを自動リリースすることができます。

    YourClass *yourOblect = [YourClass alloc] initWithId:27] autorelease]; 
    [yourObject doSomething]; 
    ..... 
    
    +0

    ありがとう、私は今=) – Stormherz

    関連する問題