我的UITableView
包含消息(消息包含文本和图像)。一开始,我的UITableView
为空:
@property (strong, nonatomic) NSMutableArray *messages; @property (strong, nonatomic) IBOutlet UITableView* tableView; - (void)viewDidLoad{ self.messages = [[NSMutableArray alloc] init]; }
UITableViewDelegate
和UITableViewDataSource
在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; ????
答案 0 :(得分:1)
在Message
对象中,声明文本变量:
@property (nonatomic, assign) NSString *text
当你获得它的价值时,这是text
为零的根本原因。如果设置值
NSString *s = @"SomeValue";
Message.text=s;
s variable
,您的文本也将被释放。因此,您应声明text
变量为strong
以保持其值。