Objective c 关于NSNotification Center的2个快捷方式

Objective c 关于NSNotification Center的2个快捷方式,objective-c,Objective C,在我找到的所有教程或示例中,它们在选择器名称后显示冒号(getCurrentData:),如下所示: [[NSNotificationCenter defaultCenter] addObserver:self 选择器:@selector(getCurrentData:) 名称:@“mapsReceived” 对象:无]; 由于示例中的冒号后面没有任何内容,因此我假设指定的方法不接受任何参数。我的也没有,但当我使用上述语法时,我的应用程序崩溃并说发送到实例的未识别选择器我删除了冒号,它就工作

在我找到的所有教程或示例中,它们在选择器名称后显示冒号(
getCurrentData:
),如下所示:


[[NSNotificationCenter defaultCenter]
addObserver:self
选择器:@selector(getCurrentData:)
名称:@“mapsReceived”
对象:无];

由于示例中的冒号后面没有任何内容,因此我假设指定的方法不接受任何参数。我的也没有,但当我使用上述语法时,我的应用程序崩溃并说
发送到实例的未识别选择器
我删除了冒号,它就工作了。那么为什么所有的例子都显示冒号呢

其次,如果我使用了一个需要参数的选择器,我该怎么做呢?如果我这样做:

[[NSNotificationCenter defaultCenter]
addObserver:self
选择器:@选择器(createButtons:@“一万”;)
名称:@“mapsReceived”
对象:无];


它甚至不会编译;在删除文本字符串和冒号之前,我会收到大量错误。然而,当在NSNotification之外使用它时,我可以使用字符串调用这个方法。有什么方法可以实现我在这里想要的吗?

如果末尾有冒号,那么它会接受一个参数。在
@selector
调用中不传递任何内容。您的第一个示例是正确的,您的
getCurrentData:
方法应该如下所示

-(void)getCurrentData:(NSNotification*)note
{
     //Implementation
}

对于您在选择器中看到的每个冒号,它是如何使用参数的,例如
@selector(aMethod:secondArg:thirdArg:)
@selector(aMethod::)
都有不同的签名,但都会使用3个参数。

NSNotificationCenter
发送通知时(通过您指定的选择器-eg
getCurrentData:
),它将传递一个
NSNotification
的实例,因此您的方法必须接受这样一个实例的单个参数


请参见

首先,大多数示例都假定您正在将通知传递给该方法。例如:

- (void)respondToNotification:(NSNotification *);
这将表现为:

@selector(respondToNotification:)
如果你删除这个论点,它将是

@selector(respondToNotification)

至于第二项,您不能以这种方式指定参数。您需要以这样一种方式构建您的方法,即它接收作为参数的通知,然后您可以检查通知并调用另一个方法来执行您需要的任何操作。

第一个问题的答案是,在目标C中,冒号is是函数名的一部分。如果忽略它,则表示引用了不同的函数,该函数不接受任何参数。但是,通知方法总是使用一个参数调用(因此必须接受)通知对象:

以下是一段摘录:


“notificationSelector指定的方法必须有且只能有一个参数(NSNotification的实例)”

如果您试图添加一个观察者并以相同的代码发送消息,则无法以这种方式工作。 您声明此方法用于响应事件,如[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(myMethod:)name:@“behaviorName”对象:nil]


然后,当事件发生时,它将被调用,您可以通过object参数将一个特殊的对象传递给它进行处理。但是,冒号后面应该传递一个特殊的事件封装对象(NSNotification),请参阅您应该为其设计myMethod:method的文档。如果您在方法代码中省略了对象,那么尝试调用它失败是有意义的,因为您正在调用另一个方法,实际上是一个重载:p

您“必须”不,您“应该”.Must意味着它不编译,它确实编译了。Should意味着如果你用另一种方式做,那么你就错了……这是真的。+1'd you'd your:DIt可以编译,但是从上面链接的文档:“指定接收者发送notificationObserver通知其通知发布的消息的选择器。notificationSelector指定的方法必须有且只有一个参数(NSNotification的实例)。”+1,尽管:)