NSNotificationCenter ,打印内存地址

Posted

技术标签:

【中文标题】NSNotificationCenter ,打印内存地址【英文标题】:NSNotificationCenter , prints memory address 【发布时间】:2013-10-17 19:27:29 【问题描述】:

我的应用中有一个 UITableview 控制器和一个视图控制器,我正在尝试使用 NSNotificationCenter 将 NSDictionary 从 UITableview 控制器传递到我的 ViewController。所以,我在我的 UITableview 控制器上推送一个通知,然后我添加一个观察者,在我的 ViewController 上使用一个选择器。选择器被调用,但我有一个 NSLog 并获得内存结果,比如:

视图控制器:0x8a0bcc0

我尝试传递 NSString 而不是 NSDictionary ,但我再次得到内存结果,而不是字符串的值。

我的代码:

UITableView 控制器

    NSString *string=@"This is a test string";
    [[NSNotificationCenter defaultCenter] postNotificationName: @"Update" object: string];

视图控制器

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(incomingNotification:) name:@"Update" object:nil];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"Update" object:self];

这里是incomingNotification选择器方法:

-(void) incomingNotification : (NSNotification *)notification
    NSLog(@"Trying to print : %@",[notification object]);

所有通知都发生在 ViewDidLoad 方法中。谢谢!

更新

最后,我退出了使用 NSNotificationCenter 并使用属性来传递数据,稍微改变了我的 TableViewController 的继承性。不知道为什么通知不起作用,因为他们应该这样做。谢谢大家,非常感谢您的建议和想法:)

【问题讨论】:

为什么在添加观察者后立即在ViewController 中发布第二条通知?这就是为什么你在控制台中得到这个字符串的原因。为什么没有测试字符串呢 - 确保在表控制器中发布通知之前添加观察者(设置断点以观察它们的顺序) 您在 ViewController 中使用对象 self 调用 postNotification,因此打印出来的是您自己的对象。 如果我删除 ViewController 中的第二个通知,则不会调用选择器方法!我现在尝试设置断点! 更新:我很确定这个问题会发生,因为首先我发布了通知,然后我添加了观察者(执行顺序问题)。有没有办法解决它?我应该首先发布通知然后解析它。我可以添加一个观察者,发布通知(在我的 TableViewController 上)然后从我的 ViewController 解析它吗? 【参考方案1】:
[[NSNotificationCenter defaultCenter] postNotificationName:@"Update" object:self]

Object 表示生成通知的对象。要发布参数,请使用其他方法

[[NSNotificationCenter defaultCenter] postNotificationName:@"Update" object:self userInfo:string]

【讨论】:

感谢您的建议,但是当我删除无关的 ViewController 观察者时,没有再次调用选择器方法。当我拥有它时-现在使用您的建议-,我再次获得内存地址结果。跨度> userInfo 必须是字典,但这是一个小改动。 是的!我认为这不是问题 :)【参考方案2】:

如果我理解正确,在您点击UITableViewController 上的按钮后会显示UIViewController。而您如果在其-viewDidLoad: 中添加ViewController 作为观察者,那么它只有在加载时才能接收通知。

你需要什么:

1) 像这样覆盖ViewController-init-initWithNibName: 方法:

-(id) init

    self = [super init];
    if (self)
    
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(incomingNotification:) name:@"Update" object:nil];
    
    return self;

因此您可以确定 ViewController 从一开始就观察通知(嗯​​,这对于您的情况可能是不必要的步骤)

2) 当您推送ViewController 时,您需要在创建后发送通知,如下所示:

-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

    ViewController *nextController = [[ViewController alloc] initWithNibName:nil bundle:nil];
    [self.navigationController pushViewController:nextController animated:YES];

    NSString *string=@"This is a test string";
    [[NSNotificationCenter defaultCenter] postNotificationName: @"Update" object: string];

但是,如果您只是尝试将一些参数从一个视图控制器发送到另一个视图控制器,那么这是错误的方法。只需在ViewController 中创建一个属性,并在UITableViewController 的方法-tableView:didSelectRowAtIndex: 中设置此属性

【讨论】:

非常感谢您的建议!您已经完全理解了这个案例。我尝试了您所说的,但没有任何反应。我的 ViewController 是从情节提要创建的,我使用 performSegueWithIdentifier 执行从我的 -(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 委托方法。所以,我不应该分配 ViewController。此外,我使用 NSNotificationCenter 的原因是我不能将 ViewController 子类化为 UITableviewController 并从中获取信息! 尼克,我也试过 initwithCoder 方法。这也行不通。 尝试在ViewController-prepareForSegue:sender:方法中订阅通知,并在-performSegueWithIdentifier之后立即发布通知。您还可以从 segue 获取ViewController[segue destinationViewController];,这样您就可以设置属性而不是使用通知 谢谢 Nick。我已经尝试了一切,但仍然有同样的问题。我退出通知,并开始设置属性。不知道为什么通知中心没有按预期工作。

以上是关于NSNotificationCenter ,打印内存地址的主要内容,如果未能解决你的问题,请参考以下文章

IOS学习之NSNotificationCenter消息机制

Android 相当于 NSNotificationCenter

Objective-C - 将 NSNotificationCenter 放在哪里?

WiFi网络更改是不是有NSNotificationCenter通知?

NSNotificationCenter传值

消息通信机制NSNotificationCenter -备