2011-01-21 9 views
0

Instrumentは、substringWithRangeを使用して2行のコードでメモリリークが発生したと報告しています。私はこのコードで明示的に使われているalloc、copy、initsを持っていないので、なぜこのようなことが起こるのか分かりません。Allocまたはinitを使用していない場合でもメモリリークが発生する

メモリリークは、このコードが関連するviewControllerを閉じるときにのみ表示されます。私は何のallocsを持っていないので、何を解放いけないpInfoはのdeallocメソッドで

NSString* path = [[NSBundle mainBundle] pathForResource:@"radio" ofType:@"txt" 
    inDirectory:@""]; 
NSString* data = [NSString stringWithContentsOfFile:path encoding: 
    NSUTF8StringEncoding error: NULL];  
NSString *nString; 

NSString *nHolder; 
NSString *iHolder; 
NSMutableArray *sHolder = [[[NSMutableArray alloc] init]autorelease]; 

for (int i=0; i<data.length; i++) 
{ 
    nString = [data substringWithRange:NSMakeRange(i, 1)]; 
    if ([nString isEqualToString: comma]) 
    { 
     if (commaCount == 0) 
     { 
          // LEAK Reported from the below line 
      nHolder = [data substringWithRange:NSMakeRange(i-rangeCount, 
          rangeCount)]; 
     } 
     else if (commaCount == 1) 
     { 
          // LEAK Reported from the below line 
      iHolder = [data substringWithRange:NSMakeRange(i-rangeCount, 
          rangeCount)]; 
     } 
      } 
    pInfo *myInfo = [[[pInfo alloc] init] autorelease]; 
myInfo = nHolder; 
myInfo = iHolder; 
    } 

そしてpInfoは

@interface pInfo : NSObject 
{ 
NSString *name; 
NSString *info; 
} 

@property(nonatomic, retain) NSString *name; 
@property(nonatomic, retain) NSString *info; 

-(id)init; 
@end 

:ここ

は、問題のあるコードです。

私がここで間違っていることを誰かが私に教えてもらえれば幸いです。

スタックトレースがある

- [NSCFString substringWithRange:]
CFStringCreateWithSubstring
__CFStringCreateImmutableFunnel3
_CFRuntimeCreateInstance

おかげ -code

+1

データとnStringとは何ですか?彼らはどこから来たのですか? – Matt

+0

にも追加されました。また、報告されたリークの正確な行にコメントしました –

答えて

0

インストゥルメントは、実際に漏れた場所ではなく、リークがどこに割り当てられたかを伝えています!

あなたはリリースによってバランスがとれていない保持を探します。 Allocations計測器では​​、カウントのトラッキングを有効にしてから、すべての保持/解放イベントを確認し、どの保持が均衡していないか、そうでない場合は正しくないかを確認できます。

nHolderとiHolderはどうしますか?

+0

あなたが要求したコードを追加しました。 pInfoクラスにはretainがあります。しかし、関連するallocがないときにリリースを必要とすることは決してわかりません。 –

+0

あなたがそれを保持する場合、それを解放する必要があります。 @propertyが保持を引き起こしているので、deallocで2つのivarsを解放する必要があります。pInfo(btw:すべてのクラス名は大文字で始める必要があります)は漏れていないので、そのクラスの不足しているリリースになるという問題があります。 – bbum

+0

hmm ok deallocのvarsに2つのリリースを追加しますpInfoクラスのメソッド。または、より良いsoloutionは、保持を削除することですか? –

0

私はリークがどこから来ているか分かりません(データが少なすぎる)。

dataに1番目と2番目のカンマを見つけて、dataの部分を抜いているようです。

もしそうならちょうど

http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html#//apple_ref/occ/instm/NSString/rangeOfString:options:range:localeのようなAPIの何かを検索する/文字列解析を使用します。最初の引数でstring@","あるとrangeは、最初のパスのために第二パスを終了するには0である

検索するにはrangeが最初にカンマが最後に見つかった場所になります。

あなたが探している2つの範囲を見つけたら、substringWithRange:を使って興味深い文字列を取得できます。

関連する問題