2011-02-22 160 views
0

只是一個快速的問題,真正做到:內存管理

我正在拉從SQLite數據庫記錄的方法到一個數組,然後分配該數組的內容,以一個實例變量。

@interface { 
NSArray *items; 
} 

@implementation 
// The population method. 
-(void)populateInstanceVariable 
{ 
    NSMutableArray *itemsFromDatabase = [[NSMutableArray alloc] init];   

    // Sqlite code here, instantiating a model class, assigning values to the instance variables, and adding this to the itemsFromDatabase Array. 


    self.items = itemsFromDatabase; 
    [itemsFromDatabase release]; 

} 
// viewDidLoad is calling the method above 
-(void)viewDidLoad 
{ 
    [self populateInstanceVariable]; 
    [super viewDidLoad]; 
} 

// TableViewDataSource method - cellforIndexPath 
- (UITableViewCell *)tableView:(UITableView *)passedInTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault]; 

    // Load in my model from the instance variable - ***1 
    MyDataModel *model = [items objectAtIndexPath:indexPath.row]; 

    // Assign the title to the cell from the model data 
    cell.textLabel.text = model.title; 

    // This is the part i'm stuck on, releasing here causes a crash! 
    [model release]; 

    return cell; 

} 

@end 

我的問題是雙重的:

  1. 是我在做什麼將數據分配給實例變量嗎?我是否正確地管理內存?
  2. 如何管理tableview數據源中該模型項的內存?我似乎能夠順利運行的唯一方法是,如果我根本不釋放*model對象,但是肯定會導致泄漏?

乾杯。

回答

2

不,你不管理內存正確位置:

  • 你應該使用「可重複使用的」 UITableViewCells,最UITableView的例子展示瞭如何做到這一點,

  • 不做[模型發佈],你沒有「自己」在這種情況下,對象,你剛剛提到它,所以你不能釋放它

這裏是典型的cellForRowAtIndexPath:

-(UITableViewCell *) tableView:(UITableView *)atableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"CellIdentifier"; 

    // Dequeue or create a cell of the appropriate type. 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) 
    { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease]; 
     // settings that do not change with every row 
     cell.selectionStyle = UITableViewCellSelectionStyleGray; 
    } 
    // settings that change with every row 
    cell.textLabel.text = @"fill in your label here"; 
    return cell; 
} 

此外,如果您使用的是DB爲你的數據,你可能想尋找到核心數據,蘋果的數據持久/管理框架,它包括掛鉤數據實體方面直接向上的能力到UITableViews。

+0

謝謝,我實際上使用可重複使用的tableviewcells,我只是不能在編寫問題時煩惱。 – 2011-02-22 22:15:27

+0

初始分配給實例變量的任何想法?即在哪裏做最好的地方,viewWillAppear,viewDidLoad?等等。 – 2011-02-22 22:16:25

+0

除第二點外。擁有手段:你做了'保留','alloc/init','新'或'複製'。 – 2011-02-22 22:19:16

0

1)填充方法是正確的。不要忘記在dealloc中將實例變量設置爲nil。 (我想你是在你使用'self'的時候添加了一個屬性/合成。)。

2)不要釋放模型對象。您沒有保留,複製或分配該方法。另一方面,你的單元格初始化是錯誤的。使用以下內容:(更好的性能)

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *Identifier = @"CellIdentifier"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Identifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:Identifier] autorelease]; 
    } 

    //Other code 
} 
+0

是的,我使用可重複使用的表格單元,我只是從速度問題中省略了它們。 – 2011-02-22 22:18:18

+0

感謝您的幫助! :) – 2011-02-22 22:18:40

+0

沒有問題,請自己清楚內存管理(釋放模型對象失敗),如果您不熟悉它,這是一個重要問題,稍後您將陷入陷阱。祝你好運。 – 2011-02-22 22:25:25