0

不変の文字列を作成しようとしています。init、alloc、またはnewで初期化していませんが、それでもメモリがリークしており、「プールが配置されていない状態でクラスNSCFStringのオブジェクト0x234b533が自動解放されました。リークしているだけです」と表示されます。これが私がやろうとしていることです。

NSMutableString *srn = [NSMutableString stringwithCString:devSID];

// devSID is *char

これは漏れを残します。私もこれを試しました

NSMutableString *srn = [NSMutableString stringwithCString:devSID length:sizeof(devSID)];

しかし、これも機能しませんが、このような単純な文字列で初期化しようとすると

NSMutableString *srn = @"this is my string";

それは機能します、周りで何が起こっているのか見当がつかないでください。initまたはallocを使用していませんが、それでもリークがあります。誰かがこの問題を解決するのを手伝ってくれるなら私は義務付けられます

よろしく

Umair

4

2 に答える 2

8

リークは、オブジェクトを処理するための自動解放プールがない状態でオブジェクトを自動解放することによって発生します。これは通常、メインスレッドとは別に、独自のスレッドを作成したり、-performSelectorInBackground:withObject:便利なメソッドを使用したりするときに発生します。自動解放機能(ここではクラスメソッドの使用によって暗示されるNSMutableString)を使用する場合は、使用するコードブロックの最初に自動解放プールを作成し、最後にそれを排出する必要があります。言い換えれば、これらの線に沿った何か:

- (void)myBackgroundThing:(id)whatever
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSMutableString *srn = [NSMutableString stringwithCString:devSID];

    // etc...

    [pool release];
}
于 2010-11-30T08:16:23.193 に答える
-1

このようなものを試してください

[[NSString stringWithCString:"Hello"]保持];

保持は、最初に作成しなかったオブジェクトのオブジェクト所有権を評価する方法であるため、これにより、すべての割り当てをリリースまたは自動リリースと照合するというルールが拡張されます。

注:このオブジェクトを保持する場合は、リリースカウントのバランスをとる必要があります。保持されているオブジェクトを解放しないと、メモリリークの問題が発生します。

于 2010-11-30T10:15:16.813 に答える