2011-01-22 5 views
2

私はまだ目的関数-cに新しいです。関数がオブジェクトを作成して返しても、それは自動解放プールにあるはずです

私が理解できる限り、私がalloc、new、copy、またはmutableCopyから取得できないオブジェクトは、autoreleaseプールにあるとみなす必要があります。

オブジェクトの新しいインスタンスを作成して返す関数を作成すると、そのオブジェクトを返す前に自動解放プールに配置する必要があるということも意味します。

たとえば、xmlを解析し、xmlのデータを表すオブジェクトを返します。そのオブジェクトは、返される前に自動解放プールに存在する必要があります。

私の主な関心事はiPhoneの開発ですが、一般的な答えは高く評価されます。

答えて

3

これは、呼び出し元が所有するオブジェクトを返すか、呼び出し元が所有していないオブジェクト(たとえば、自動解放されたオブジェクト)を返すかの両方の方法で実行できます。選択する戦略にかかわらず、命名規則に従ってください。たとえば、

- (NSString *)fullNameCopy { 
    return [[NSString alloc] initWithFormat:@"%@ %@", self.firstName, self.LastName]; 
} 

は、発信者が所有するNSStringオブジェクトを返します。メソッド名はfullNameCopyで、名前付け規則に従います。名前に 'copy'を含むメソッドは、呼び出し元が所有するオブジェクトを返します。戻り値は自動解放プールに置かれません。

また

- (NSString *)fullName { 
    return [NSString stringWithFormat:@"%@ %@", self.firstName, self.LastName]; 
} 

または

- (NSString *)fullName { 
    NSString *s = [[NSString alloc] initWithFormat:@"%@ %@", self.firstName, self.LastName]; 
    return [s autorelease]; 
} 

リターン呼び出し側によって所有されていない文字列を

、およびメソッド名がアロケーション、新しい、またはコピーが含まれていません。戻り値はオートリリースされているため、呼び出し側が明示的に保持しない限り、対応するオートリリースプールが排水されたときに解放されます。

あなたの特定のシナリオでは、呼び出し元が所有していないオブジェクトを返す2番目の戦略は、より良い解決策のように見えます。呼び出し元は、オブジェクトを即座に処理する(オブジェクトを所有することに関心がないように)か、またはプロパティ(コピーまたは保持プロパティのいずれかである可能性が高い)に保持することが最も一般的です。

2

はい、あなたの権利。あなたの関数にメモリを割り当てた場合は、それを解放する責任もあります。この状況では、割り当てられたオブジェクトを返すので、解放する唯一の方法は、自動解放プールに配置することです。

return [newObject autorelease]; 

(編集)

+0

@ピートの質問の最初の部分は間違っています。 – kubi

+0

autoreleaseに置いた場合にどのような問題が起こるか説明できますか?私は本当に問題が表示されません? –

+0

実際に私は、ピートはちょうどそれを得たと思う。規約では、new、allocまたはcopyで始まらないメソッドは、自動解放されたオブジェクトを返すべきです。このメソッドの呼び出し元は、それを保持したい場合、それを保持する責任があります。 –

0
  1. あなたはObjective-C memory management guideをお読みください。
  2. newallocまたはcopyメソッドから返されるオブジェクトはすべてあなたのものです。あなたはそれを所有しており、それを解放しなければなりません。
  3. 他のメソッドから返されたオブジェクトはすべて、自動解放プールにあります。現在のスコープを超えてオブジェクトを保持したい場合は、オブジェクトを保持する必要があります。

XMLの例は、おそらく正しいです:あなたはメソッドからオブジェクトを返していると、そのメソッドの名前が名前にnewcopyが含まれていない場合は、慣例により、自動解放オブジェクトを返す必要があります。

+0

実際には、ピートはちょうどそれを得たと思う。規約では、new、allocまたはcopyで始まらないメソッドは、自動解放されたオブジェクトを返すべきです。このメソッドの呼び出し元は、それを保持したい場合、それを保持する責任があります。 –

+0

あなたは自分の投稿を誤解していると思います。私は、あなたが "割り当てられていないオブジェクトはありません"ということを忘れてしまったと思います。しかし、私があなたが書いたことを理解しているので、私のメソッドに "解析"と名前をつけたら、返す前にautoreleaseを呼び出すべきです。 「newUserFromXml」と名前を付けると、すべきではありませんか? – Pete

+0

リンクでうれしいですが、私はまだそれを読んでいませんが、すぐにそれを読むでしょう。 – Pete

関連する問題