0

これは、Objective-C のメモリ管理に関する質問です。

About Memory Managementページにいくつかの例があります

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

そして2つ目

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

唯一の違いは、最初の例では初期化子が呼び出され、2 番目の例ではクラス ファクトリ メソッドが呼び出されることです。

基本的なメモリ管理規則のセクションでは、alloc呼び出しの後、割り当てたオブジェクトを所有すると言われています。したがって、最初の例では、オブジェクトを割り当て、同時に初期化しています。これで私はオブジェクトを所有し、それをしなければなりませreleaseん。2 番目の例では、そうではありません。しかし、ファクトリ メソッドstringWithFormat:は 1 回の呼び出しで同じことを行うのではないでしょうか。つまり、オブジェクトを割り当てて初期化するということです。

主な質問は、2 番目の例でオブジェクトを解放する必要がないのはなぜですか? クラスファクトリメソッドを実装する際に特別なメモリ管理規則はありますか?

4

3 に答える 3

2

慣例により、クラス ファクトリ メソッドは自動解放プールにあるオブジェクトを返します。最初の例と同様に、alloc、init、autorelease が実行されます。保持しない限り、プールが空になると解放されます。

于 2012-05-04T20:45:29.480 に答える
1

2 番目の例では、文字列を作成していません。allocnewcopy、またはで始まるメソッドを呼び出すことによってのみ、オブジェクトを作成しますmutableCopy

必要に応じて を呼び出すことで所有権を取得できますretainが、その場合は を呼び出す責任もありますrelease。この例では、必要ありません。もう文字列は必要ありません。呼び出し元がそれに対して行うことは、呼び出し元の責任です。

このようなファクトリ メソッドを呼び出すと、通常は自動解放されたオブジェクトを受け取ります。しかし、あなたは本当にそれについて考える必要はありません。作成していないため (その文字列を取得するためalloc, new, copy, またはで始まるメソッドを使用しなかったためmutableCopy)、保持カウント デルタについて考えるだけです。あなたの下から消えないように。呼び出し元に返されるだけなので、この例の答えはノーです。

于 2012-05-04T20:52:36.993 に答える
0

そうです、ファクトリメソッドは内部でを呼び出し、alloc保持されたオブジェクトを返しますが、そのオブジェクトを最も近い自動解放プールに追加するため、そのプールが排出されると、オブジェクトは解放されます。

于 2012-05-04T20:48:52.243 に答える