NSObject
没有任何名为 的属性footer
,这就是编译器抱怨的原因。将 id 转换回 anNSObject
无济于事。如果您知道该对象始终是您创建的某个自定义对象,则可以转换回该对象,然后调用 footer,编译器不会抱怨。最好实际检查一下。请参见下面的示例(例如,我将具有footer
属性的类命名为ViewWithFooter
,因此请适当地重命名):
- (void)handleUnpresent:(NSNotification*)note
{
ViewWithFooter view = (ViewWithFooter*)[note object];
NSParameterAssert([view isKindOfClass:[ViewWithFooter class]]);
UIView* footer = [view footer];
// Do something with the footer...
NSLog(@"Footer: %@", footer);
}
如果您有一堆不相关的类(即不在同一个类层次结构中)都提供一个footer
属性,那么您最好创建一个具有所需footer
属性的协议并将对象转换为上面代码示例中的协议和断言它响应-footer
选择器。
下面是一个使用协议的例子:
@protocol ViewWithFooter <NSObject>
- (UIView*)footer; // this could also be a readonly property, or whatever
@end
- (void)handleUnpresent:(NSNotification*)note
{
id<ViewWithFooter> view = (id<ViewWithFooter>)[note object];
NSParameterAssert([view respondsToSelector:@selector(footer)]);
UIView* footer = [view footer];
// Do something with the footer...
NSLog(@"Footer: %@", footer);
}