2011-12-13 73 views
0

我是一種新的iOS開發以及堆棧流.so如果有任何問題,我的帖子告訴..我會糾正它們。從字符串中檢索特定的文本行..內存管理問題

我想從我有文本格式(.rtf)文件中檢索字符串.. 該文件是我的應用程序主束內 其內容是

#start word1 First word end word2 Second word end //lots of things to be added later 

代碼:

path = [[NSBundle mainBundle]pathForResource:@"words" ofType:@"rtf"]; 
    if(path) 
    { 
     NSLog(@"path exists"); 
    } 
    NSError *error = nil; 

    NSString *file = [[NSString alloc]initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error]; 
    if(error) 
    { 
     NSLog(@"error"); 
    } 
    NSString *finalword= [[NSString alloc]init ]; 
    NSString *startfrom = [[NSString alloc] initWithFormat:@"word%i",i+1]; 
    i++; 
    NSLog(@"%@",startfrom); 
    NSString *wordoftheday = [[NSString alloc]init ]; 
    NSScanner *scanner = [NSScanner scannerWithString:file]; 
    [scanner scanUpToString:startfrom intoString:nil]; 
    [scanner scanUpToString:@"end" intoString:&wordoftheday]; 
    finalword = [wordoftheday substringFromIndex:[startfrom length]]; 
    NSLog(@"%@",finalword); 
    Word.text = final word; //change label text 
//[final word release]; 
//[wordoftheday release]; 
//[file release]; 

代碼工作正常,但它留給我的內存管理問題。 如果我釋放最後一個註釋代碼中的變量,應用程序崩潰。

此方法也在我的viewdidload中。 我想要標籤改變文本,當用戶點擊一個按鈕..我將不得不再次編寫相同的代碼在該方法,留下更多的內存問題。

請help..if你有什麼更好的建議或如何解決內存問題

回答

1

所以看着這些一個接一個,着眼於內存問題,而不是整體戰略位置:

NSString *finalword= [[NSString alloc]init ];

在這裏,您分配/初始化一個新的不可變空的NSString,然後您就可以最終改寫指向這一點。你應該刪除這一行。然後你需要幾行移動聲明到這一點:

NSString *finalword = [wordoftheday substringFromIndex:[startfrom length]];

然後你:你需要

NSString *startfrom = [[NSString alloc] initWithFormat:@"word%i",i+1];

這一個晚些時候發佈。或者只是將其更改爲:

NSString *startfrom = [NSString stringWithFormat:@"word%i",i+1];

然後,你必須:

NSString *wordoftheday = [[NSString alloc]init ];

同樣的故事作爲finalword。除了你需要定義這個變量,所以你可以稍後將它傳遞給掃描器。因此,將其更改爲:

NSString *wordoftheday = nil;

最後,你可以釋放 '文件'。沒事兒。但是你不想發佈'wordoftheday'或'finalword',因爲你不擁有這些字符串。你沒有自己創造它們。

和另一注:

if(error)

那是不是您在加載「文件」的錯誤的正確方法。您應該檢查方法的返回值,並且當且僅當返回值爲零時查找錯誤。因此,改變該行:(好吧,這是不是一個真正的內存問題,而是一個錯誤我也注意到)

if(!file)

我認爲這是這一切至少儘可能內存問題。我希望有所幫助。

+0

感謝您的回答......我已經將路徑設爲非原子並保留了我的界面中的屬性。所有其他的事情都是在這個代碼中的初始化..所以,如果從viewdidload剪下這段代碼並用它創建一個新函數..如果我向這個函數發送多個調用,將會是任何問題,因爲path = [nsbundle ...將被調用一次又一次? – Shubhank

+0

好吧,確保你做self.path = ...在這種情況下。但是一旦你有了這條道路,爲什麼每次都要再次找到它呢?它不會改變,是嗎?當然,這會導致更大的問題,爲什麼不加載這些單詞並在整個應用中使用它們而不是多次解析它們?這些是更大的問題,但我只是想解決內存管理問題。 –

+0

應用程序中會有很多單詞...所以我不想一次加載它們..我只是想改變每個按鈕單擊的標籤文本..這就是爲什麼我使用函數調用來獲取下一個詞。 – Shubhank

-1

使這些變量作爲成員變量,並在釋放的dealloc

+0

爲什麼-1?讓我知道原因 – Tendulkar

+0

對不起,沒有做-1 ..使他們的成員變量..什麼將是它的好處..我有路徑作爲成員變量..但如果我讓每個變量的一個成員變量然後我會發送alloc和init函數(viewdidload和按鈕)都不會是一個問題? – Shubhank

+0

而不是使用NSString使用NSMutableString – Tendulkar