2011-06-28 11 views
0

メモリリークが発生するtheFileName = [[responseString lastPathComponent]stringByDeletingPathExtension];iphoneプログラミング+メモリリーク

theFileNameはグローバル変数です。私はそれを合成しました。

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) 
    { 
     // Custom initialization 
     theFileName = [[NSString alloc] init]; 
     } 
    return self; 
} 

- (void)requestFinished:(ASIHTTPRequest *)request{ 

    //internally calls this function 
    // Use when fetching text data 
    NSString *responseString = [request responseString]; 
    //NSLog(@"the responsestring for download is:%@",responseString); 
    theFileName = [[responseString lastPathComponent]stringByDeletingPathExtension]; 
    //NSLog(@"the theFileName for download is:%@",theFileName); 
    //adds extension .jpg to file name 
    NSString *[email protected]".jpg"; 
    NSString *addjpg=[theFileName stringByAppendingString:jpg]; 
    //NSLog(@"append %@",addjpg); 
} 

deallocでリリースしました。

-(void)dealloc 
{ 
[thefileName release]; 
} 
} 
+2

@あなたの投稿を投稿できますか? – tjg184

+0

deallocを呼び出さない可能性はありますか?これはあなたのメモリリークに関連するとどのように判断しましたか? –

+0

@James:もちろん、自分の 'dealloc'内の' super'を除いて自分自身で '-dealloc'を呼び出すことは決してありません。それについて言えば、あなたは 'super 'に' dealloc'も呼んでいません。 – SK9

答えて

1

ここにはいくつか役立つ情報があります。

  1. あなたはsuperselfdealloc方法のdeallocを呼び出していません。例えば、

    - (void) dealloc { [self.theFileName release]; [super dealloc]; }

  2. あなたは、プロパティを合成して来ゲッターとセッターを使用していない、と私たちはあなたがtheFileNameで使用したものプロパティを知りません。保持プロパティ、つまり@property (copy) NSString * theFileNameのようなステートメントを持っている場合は、保持者数が増えないようにセッターを使用する必要があります。例えば、

    • (ID)initWithNibName:(NSStringの*)nibNameOrNil束(NSBundle *)nibBundleOrNil { IF((自己= [スーパーinitWithNibName:nibNameOrNil束:nibBundleOrNil])) { //カスタム初期化 NSString * aFileName = [[NSString alloc] init]; [self setTheFileName:aFileName]; [aFileName release]; } return self; }

は良好です。

3
theFileName = [[responseString lastPathComponent]stringByDeletingPathExtension]; 

すでにNSStringオブジェクトを保持theFileNameための新しいオブジェクトを作成します。あなたは、あなたがcopy(推奨)またはtheFilenameためretainプロパティの使用を検討し、requestFinished:にドットシンタックスを使用する場合があります

[theFileName release]; 
theFileName = [[responseString lastPathComponent]stringByDeletingPathExtension]; 

すなわち

、前 releaseにその古い値を必要としています。

+0

@property(nonatomic、retain)NSString * theFileName;これはプロパティの割り当て方法です。 – xcodelearner

+0

次に、self.theFileName = [[responseString ...] ...]を使用します。 – Eiko