5

私はASIHTTPRequestライブラリを使用していますが、メモリ管理の観点から、それを適切に使用しているかどうかを確認したいと思います。私が作成する:

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:someUrl];

命名規則によれば、リクエストオブジェクトを保持する必要はないと思いますよね?しかし、requestWithURL:someUrlメソッドのコードを見ると、次のことがわかります。

+ (id)requestWithURL:(NSURL *)newURL
{
return [[[self alloc] initWithURL:newURL] autorelease];
}

したがって、返されたオブジェクトは自動解放されます。コードに保持するべきではありませんか?

4

2 に答える 2

5

メソッド内でautoreleaseオブジェクトを使用する場合は、保持しないでください。これで問題ありません。

- (void) myMethodDoRequest
{
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:someUrl];
    // use request within this scope only
}

自動リリースオブジェクトをivarに保存する場合は、オブジェクトのライフサイクルを拡張するために保持する必要があり、リークを回避するために後者のリリースを保持する必要があります。

@interface MyClass
{
    ASIFormDataRequest *request;
}

- (void) myMethodStoreRequest
{
    [request release];
    request = [[ASIFormDataRequest requestWithURL:someUrl] retain];
}

- (void) dealloc
{
    [request release];
}
于 2011-10-21T09:01:28.403 に答える
3

一般的にはありません-自動解放されるため、自動解放プールによって保持され、スコープ外になると解放されます。ただし、提供する追加のセキュリティが必要な状況にある場合は、保持してから解放することができます。

于 2010-06-09T10:53:42.787 に答える