我是iphone開發新手。我是「老學校」 - 在編程時我習慣使用程序等。現在一切都是面向對象的,但我的風格依然如此。請記住這一點。我的項目很小,實際上只是一個概念證明。從Plist詞典顯示隨機單詞 - 內存泄漏?
下面的程序在計時器上工作 - 每隔30秒它會從我的應用程序中存儲在Dictionary.plist中的名稱數據庫列表中讀取一個隨機寶寶名稱。然後在iphone屏幕上顯示這個名字。
你可以看到下面的代碼的完整的相關部分。 會發生什麼 - 如果我增加計時器以非常快的速度運行 - 最終它似乎耗盡內存或其他東西,因爲它只是顯示?而不是下一個隨機寶貝的名字。 我懷疑這是由於我每次讀它都沒有關閉數據庫文件。
無論如何,有人可以看看我的代碼(與我的上述意見考慮),並告訴我,我需要添加什麼來阻止它顯示?這麼多的運行後..
我只是每次打開文件ShowNextName因爲我不能想出另一種方式來做到這一點..
我知道它不是偉大的風格在此開始使用變量代碼是全球等,但有沒有可能重組或增加一些東西,以阻止它「崩潰」或在這麼多次運行後有點搞笑的方式...
我會很感激。謝謝。
#import "BabyNameViewController.h"
@implementation BabyNameViewController
NSDictionary *dictionary;
NSString *name;
int nameCount = 0;
int RecordIndex = 0;
- (void)ShowNextname;
{
NSString *path = [[NSBundle mainBundle] bundlePath];
NSString *finalPath = [path stringByAppendingPathComponent:@"Dictionary.plist"];
NSArray* plistArray = [NSArray arrayWithContentsOfFile:finalPath];
// Generate a random number between 0 and (the number of records-1) - used as a random index!
RecordIndex=arc4random()%[plistArray count];
// Select and display currently selected record from the array.
dictionary = [plistArray objectAtIndex:RecordIndex];
name = [dictionary objectForKey:@"name"];
[nameLabelOutlet setText: [NSString stringWithFormat: @"Random Baby Name is: %@", name]];
}
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];
// Initial App entry point - startup code..
// Open the dictionary to count the number of names and store it for later use.
NSString *path = [[NSBundle mainBundle] bundlePath];
NSString *finalPath = [path stringByAppendingPathComponent:@"Dictionary.plist"];
NSArray* plistArray = [NSArray arrayWithContentsOfFile:finalPath];
nameCount = [plistArray count];
// Generate random name from database
[self ShowNextname];
// Start up the nameUpdate timer.
[NSTimer scheduledTimerWithTimeInterval:30 target:self selector:@selector(nameUpdate) userInfo:nil repeats:YES];
}
-(void) nameUpdate {
[self ShowNextname];
}
謝謝 - 現在閱讀該文檔。是的,這是問題 - 我每次都會將plist重新加載到一個新陣列中。我知道你在說什麼,但不知道實現它的語法 - 你可能會告訴我要使用的代碼行,它將視圖控制器中的plist加載到實例變量中 - 我將它放在哪裏在showNextName中? 我會改變我的代碼風格,重新評論類/方法,並在最後解除分配。謝謝你的幫助。 – 2010-01-16 00:46:54
在括號內的.h中聲明'plistArray'。這將使它成爲一個實例變量,您可以從類中的任何'-'方法訪問它。 – 2010-01-16 00:58:58
就像弗蘭克說的那樣,但是當你設置實例變量以確保它沒有獲得空閒()d時,你應該真的做一個[plistArray retain]。 (方法'retain'和'release'遞增或遞減一個引用計數,當count數降到0時,會導致free()被調用,因爲你有一個引用,所以你想增加count。)另見http:/ /developer.apple.com/mac/library/documentation/cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html,它會告訴你如何聲明一個帶有'retain'關鍵字的屬性將有助於維護你的引用計數。 – Nimrod 2010-01-16 01:36:00