2012-11-20 19 views
0

我有代码invokeSelector:withObject:崩溃的发行

[target invokeSelector:handler.successAction withObject:object]; 

它可以调用一些方法。与对象或没有。它完美的工作在调试,但崩溃在版本:

Nov 20 21:55:13 efpies project[7202] <Warning>: >>>> selector: successfulLogin 
Nov 20 21:55:13 efpies project[7202] <Warning>: >>>> target: <AppDelegate: 0x1f595a90> 
Nov 20 21:55:13 efpies project[7202] <Warning>: >>>> object: <7b226d65 73736167 65223a22 5c753034 31325c75 30343435 5c753034 33655c75 30343334 205c7530 3434305c 75303433 305c7530 3433375c 75303434 305c7530 3433355c 75303434 385c7530 3433355c 75303433 64227d> NSConcreteMutableData 
Nov 20 21:55:13 efpies project[7202] <Error>: -[AppDelegate invokeSelector:withObject:]: unrecognized selector sent to instance 0x1f595a90 

Nov 20 21:56:12 efpies project[7205] <Warning>: >>>> selector: driversUpdated: 
Nov 20 21:56:12 efpies project[7205] <Warning>: >>>> target: <DriversList: 0x1cd5ffd0> 
Nov 20 21:56:12 efpies project[7205] <Warning>: >>>> object: (
    ) __NSArrayM 
Nov 20 21:56:12 efpies project[7205] <Error>: -[DriversList invokeSelector:withObject:]: unrecognized selector sent to instance 0x1cd5ffd0 

这些方法是可用的(甚至在头文件中)。怎么了?该数据和对象是100%正确

+0

使用[target performSelector:handler.successAction];这是在可可触摸中这样做的方式,因为NSObject将为您处理这个问题。检查https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/occ/intfm/NSObject/performSelector:withObject: – iDev

+0

@ACB :我确信'handler.successAction'可能已经是一个'SEL',所以正确的调用将是'[target performSelector:handler.successAction withObject:object]'。 – Tim

+0

@Tim,感谢您的纠正。改变了它。 – iDev

回答

0

事实证明,invokeSelector:withObject:是静态库中的一个类别方法。从静态库分类,所以你应该写

-force_load $(BUILD_ROOT)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/lib_name.a

Other linker flag领域目标的Build settings如果它编译为目标的依赖不会自动加载。

+0

但是,当performObject被NSObject协议提供时,为什么使用这个类别的方法?它有什么用处? – iDev

+0

@ACB'performSelector'可以对可能的泄漏发出警告。例如,你可以为'id'类型的对象调用'performSelector'。因为编译器不知道是否存在这样的选择器(编译时类型未知)。为了关闭它,并且不要在每个地方写“杂注”,封装器都已经写好了。它只是用'#pragma clang diagnostic push'#'#pragma clang diagnostic pop'包装'performSelector',并在里面有一个指令:'#pragma clang diagnostic ignored“-Warc-performSelector-leaks”'。但是现在我们应该确保在随机对象中调用适当的选择器。 – efpies

1

使用

[target performSelector:handler.successAction withObject:object]; 

即为此在可可触摸,因为NSObject将您处理该问题的方式。 检查Apple documentation了解更多详情。