在UITableView中动态添加数据

时间:2014-05-26 09:47:03

标签: ios objective-c uitableview

我的UITableView包含消息(消息包含文本和图像)。一开始,我的UITableView为空:


@property (strong, nonatomic) NSMutableArray *messages;
@property (strong, nonatomic) IBOutlet UITableView* tableView;

- (void)viewDidLoad{  
    self.messages = [[NSMutableArray alloc] init];
}

UITableViewDelegateUITableViewDataSource在IB中相关联。当我收到消息时,我想在UITableView上显示如下消息:

- (void)didReceiveMessage:(NSNotification *) notification{

    //- extract message
    NSDictionary* userInfo = notification.userInfo;
    Message* msg = [userInfo objectForKey:kNotificationMessage];

    //- update table
    [self.messages addObject:msg];
    [self.tableView reloadData];
    [self scrollTableViewToBottom];
}

此时,我的Messages可变数组包含完整的消息。但是,重新加载UITableView时,该消息似乎指向另一个地址。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{   

    Message *message = [self.messages objectAtIndex:indexPath.row];     
    cell.textLabel.text = message.text;
    cell.imageView.image = [message getImage];
}

消息不是nil,但message.text是nil。我怀疑在退出函数didReceiveMessage时userInfo是释放的。那么,这就是消息不是零的原因,而是指向一个不包含任何内容的地址。我尝试做的是保留或复制邮件,然后将其添加到NSMutableArray消息中,如:

- (void)didReceiveMessage:(NSNotification *) notification{

    //- extract message
    NSDictionary* userInfo = notification.userInfo;
    Message* msg = [userInfo objectForKey:kNotificationMessage];
    Message* copyMsg = [msg copy];

    //- update table
    [self.messages addObject:copyMsg];
    [self.tableView reloadData];
    [self scrollTableViewToBottom];
}

但我担心做这样的事情会使程序泄漏。你有什么解决方案吗?或者解释一下为什么?

更多信息:

我的Message类看起来像这样:

@interface Message : NSObject

@property (nonatomic, assign) NSString *text;

@end

我是否需要将其更改为@property(nonatomic,retain)NSString * text; ????

1 个答案:

答案 0 :(得分:1)

Message对象中,声明文本变量:

@property (nonatomic, assign) NSString *text

当你获得它的价值时,这是text为零的根本原因。如果设置值

NSString *s = @"SomeValue"; Message.text=s;

之后发布

s variable,您的文本也将被释放。因此,您应声明text变量为strong以保持其值。