2011-12-13 76 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