1

は次のエラーを手動で割り当てて、メモリを解放したときに、実行時に生成されますNSString alloc autorelease poolの外で、不思議なメモリリークが発生する?

objc[10430]: Object 0x109014b60 of class __NSCFData autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug 

私はインターネットを検索するが、通常、これらのエラーは、メモリを解放するか、自動解放速記を使用していないことが原因で発生している...私は、任意の未発表のメモリを見つけることができません私はオートレリースの略語を使っていません...あなたが手伝ってくれることを願っています!

私のコードは次のとおりです。インスタンスメソッド内で自動解放プールを置く

#import "try.h" 

@implementation try 

- (try*)initWithSwing 
{ 
    self = [super init]; 
    if (self) { 
     [self tellAboutSwing:YES]; 
    } 

    return self; 
} 

- (void) tellAboutSwing: (BOOL) swing { 

    NSString *s = [[NSString alloc] initWithFormat: @"%@ %@", @"Do we have a swing on our playground?", (swing ? @"Yes" : @"No")]; 


    // cast to a char 
    const char *c = [s UTF8String]; 
    [s release];  
    printf("%s", c); 

} 

- (void) dealloc { 
    printf("Deallocing Playground\n"); 
    [super dealloc]; 
} 

int main(void) { 
    try *t; 
    t = [[try alloc] initWithSwing]; 
    [t release]; 
} 

@end 

問題を修正し、それはNSString allocを必要はありません。私はObjective-Cの新機能ですが、変数の所有と解放の概念を把握していると思いますが、ここでエラーを見つけるのは難しいです。

ここに私の.hファイルです:

#include <Foundation/Foundation.h> 


@interface try : NSObject 
- (void) tellAboutSwing: (BOOL) swing; 
@end 

ヘルプをいただければ幸いです:)

よろしく、

ロバート

+2

*あなたがautoreleaseを使用していないという理由だけで、*フレームワーク*はそうではありません。 NSStringクラスは、望むときはいつでも(所有している限り)、必要なものを自動で解放することができます。これは、objective-cを使用するときに常にオートリリースプールを持つことになっている理由です。 – ughoavgfhw

+0

私はこれが当てはまるとは思わなかった。私は確かに上記のメッセージを持っていますが、それはいつも明白な原因によるものです。この場合、UTF8String呼び出しが原因である可能性があります。 –

答えて

5

IIRC -[NSString UTF8String]を実際にバイトを保持するために自動解放NSDataを使用していますが、 UTF-8 C文字列の

アップデート:ここだけのC関数を使用して簡単な方法です:

- (void) tellAboutSwing: (BOOL) swing {  
    printf("%s %s", "Do we have a swing on our playground?", (swing ? "Yes" : "No")); 
} 
+0

助けてくれてありがとう!それだった!今学習のためだけに(おそらく、最初から 'UTF8String'を使って自動解放を避けることができます)。 'NSString'をcharにキャストしながら、オートレリースされた' NSData'オブジェクトの作成を回避する方法はありますか? NSDataオブジェクトの所有権を取得できますか? '[c retain]'はコンパイラエラーを引き起こします、なぜですか?私が言ったように、私はObjective-Cを新しくしており、確かな理解を得ようとしています.MMに関するほとんどの文書はこれらの詳細には入りません。事前に感謝、ロバート! – Robert

+0

自動解放プールを使用できない理由はありますか?つまり、代わりにoldschool C関数を使用することができます。 – Wevah

1

あなただけのNSAutoreleasePoolを使用する必要があります。あるものを持っているのは普通ですが、オートレリースされたオブジェクトを内部的に作成していない選択肢は見つけられません。

私はあなたがメモリ管理と基本についてのチュートリアルとガイドをチェックするべきだと思います。そうしないと、Objective-Cに苦労するでしょう。

たとえば、iTunesUには無料でObjective-Cの基本が説明されている素晴らしいコースがあります。

関連する問題