0

objc [23601]:クラス__NSCFSetのオブジェクト0x12b090f0が自動リリースされ、プールが配置されていません-リークしているだけです-objc_autoreleaseNoPool()で中断してデバッグします

次のコードセクションで上記のリークエラーが出力されるのはなぜですか?

+ (BOOL)getSkipFlag
{

    NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
    if ( ![defs objectForKey:_BOOK_ID] )
    {
        [defs setObject:@"yyyy" forKey:_BOOK_ID];

        [defs synchronize];
    }

    if ( ![[defs objectForKey:_BOOK_ID] isEqualToString:@"xxxx"] )
    {
        return NO;
    }

    return skipFlag;
}

利用方法

if ( ![ClassXYZ getSkipFlag] )
....

新しいスレッドを使用しないので、新しい自動解放プールを設定する必要はありません。

注:NSString *temp = [[NSBundle mainBundle] pathForResource:_CONFIG_PLIST ofType:@"plist"];-iOS5.1を使用しているのと同じエラーが出力されます

洞察をありがとう。

更新:ClassXYZ.m ... static BOOL skipFlag = NO;

セッター:+(void)setSkipFlag:(BOOL)boolValue {skipFlag = boolValue; }

使用法:[ClassXYZ setSkipFlag:YES];

static void convert_uri_to_file_name(struct mg_connection * conn、const char * uri、char * buf、size_t buf_len)で使用されます

オマールあなたはそれがどこで使われるかについて良い点を持っていました。たとえば、I ClassXYZ独自のインスタンスメソッドを使用すると、エラーなしで機能することがわかります。

4

2 に答える 2

1

通常、メインスレッドの自動解放プールは、main関数の最初の行に作成されます。関数の前に実行されるmainものはすべて、自動解放プールが存在しないことを認識します。

+load関数は関数の前に実行されるため、リークを引き起こす1つの理由ですmain。その場合は、+initialize代わりに使用することを検討してください。

于 2012-06-11T11:21:44.927 に答える
0

好奇心から、そのログ内に関数呼び出しを入れると、@autoreleaseログは消えるはずです

于 2012-06-12T06:51:31.727 に答える