我见过代码如下:
if (delegate != nil && [delegate respondsToSelector:@selector(doSomething)]) ...
Run Code Online (Sandbox Code Playgroud)
但是,发送消息nil只返回nil(评估为NO),所以为什么不这样做:
if ([delegate respondsToSelector:@selector(doSomething)]) ...
Run Code Online (Sandbox Code Playgroud)
如果前者更快delegate == nil吗?无论哪种方式,我更喜欢后者,因为它的代码更少.
并且,less比more.每个Unix专业人员都知道.
好的,我有点困惑.
我有一个UIScrollView的子类,这是我尝试像UI元素一样水平滚动"表视图".UIScrollView本身设置它在内部使用的UIGestureRecognizers,它似乎将自己设置为那些UIGestureRecognizers的委托.我在我的水平表元素/单元格上也有自己的UIGestureRecognizer设置,我自己的类设置为我自己的UIGestureRecognizer的委托.由于我的类是UIScrollView的子类,在运行时,UIGcureRecognizer委托调用来到我的类,用于UIScrollView内置的UIGestureRecognizers和我自己的UIGestureRecognizers.有点像PITA,但我们可以通过传递我们不关心的东西来解决这个问题.
-(BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
if ([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]])
return NO;
else
{
if ([super respondsToSelector:@selector(gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:)])
return [super gestureRecognizer:gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:otherGestureRecognizer];
else
return NO;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是检查[super respondsToSelector:@selector()]返回YES,但是当我实际调用它时,return [super gestureRecognizer:gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:otherGestureRecognizer];我得到以下异常
2012-08-31 12:02:06.156 MyApp [35875:707] - [MyAppHorizontalImageScroller gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:]:无法识别的选择器发送到实例0x21dd50
我本以为应该表明
- [UIScrollView gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:]
但那可能没问题.但问题是,它说它响应然后不响应.
另外两个UIGestureRecognizer委托例程使用此代码(显然是不同的选择器).
感谢您的任何见解.
delegates objective-c super uigesturerecognizer respondstoselector
当想要在委托对象上调用协议方法时,希望实现相应的协议方法,我看到开发人员首先检查
if([delegate respondsToSelector: @selector(aMethod)])
{
//send message;
}
Run Code Online (Sandbox Code Playgroud)
这样做不是更好甚至更安全吗?:
if([delegate conformsToProtocol:@protocol(MyProtocol)] && [delegate respondsToSelector: @selector(aMethod)])
{
//send message;
}
Run Code Online (Sandbox Code Playgroud)
我知道如果协议方法定义已经正确地构造,那么代理中永远不应该有任何冲突或实现,这些冲突或实现可能不适合/来自MyProtocol.这样的冲突很遥远,但我遇到了一个简单声明为 - (void)willStartLogin;的协议方法定义.我相信你已经可以开始思考并建议这样的协议方法是如何坏的,例如它可以由代表实现个人/内部使用,而不是在myDelegate协议下使用.最好将MyProtocol的方法声明为: - (void)myObjectWillStartLogin:(MyObject*)myObjectInstance; 这样可以摆脱任何歧义,使事情变得明显.
我希望我没有遗漏任何使得只需要检查respondsToSelector的东西:谢谢
Class Child扩展Parent.父实现协议C,它具有可选方法,包括-(void)d.孩子有执行-d; 应该调用[super d]吗?
换句话说,[super d]当且仅当某些内容会响应时,我会编写什么代码来调用?假设我不控制Parent的实现; 它可能随时改变.
这是我想到的所有方法.我目前正在使用4号.
显然是明智的答案1:
[super d]; // Delete this line if a runtime exception occurs when you try it
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为Parent可能会动态实现-d,因此当您测试它而不是在字段中时,它会起作用.或者Parent的实现可能会更改,以便此测试的结果不再正确.
显然是明智的回答2:
if ([super respondsToSelector:_cmd])
[super d];
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为NSObject的-respondsToSelector实现将在Child中找到实现并在所有情况下返回YES.
显然是明智的答案3:
if ([[self superclass] instancesRespondToSelector:_cmd])
[super d];
Run Code Online (Sandbox Code Playgroud)
当且仅当超类知道它总是实现-d时,这是有效的; 如果实例动态确定是否存在此方法,则此方法将不起作用.优于1,因为它将在运行时获取对Parent实现的静态更改.
显然是明智的回答4:
@try
{
[super d];
}
@catch (NSException *exception)
{
NSString *templateReason = [NSString stringWithFormat:
@"-[%@ %@]: unrecognized selector sent to instance %p"
,NSStringFromClass([self superclass])
,NSStringFromSelector(_cmd)
,self];
if (![exception.reason isEqualToString:templateReason])
@throw …Run Code Online (Sandbox Code Playgroud) 我的最新版本被苹果应用程序商店接受了,但几天之后我收到了下面引用的通知.
我的应用程序也使用Rollout.io,我明确询问这是否是问题所在.还没有回复.
如果禁止respondsToSelector或performSelector,是否有任何替换?
亲爱的开发者,
您的应用,扩展程序和/或链接框架似乎包含明确设计的代码,可以在App Review批准后更改应用的行为或功能,这不符合Apple开发人员计划许可协议和应用的第3.3.2节商店评论指南2.5.2.与最初针对App Store进行审核时相比,此代码与远程资源相结合,可以促进应用程序行为的重大更改.虽然您当前可能没有使用此功能,但它有可能加载私有框架,私有方法并启用将来的功能更改.
这包括将任意参数传递给动态方法的任何代码,例如dlopen(),dlsym(),respondsToSelector:,performSelector:,method_exchangeImplementations(),以及运行远程脚本以便根据内容更改应用程序行为或调用SPI.下载的脚本.即使远程资源不是故意恶意的,它也很容易被中间人(MiTM)攻击劫持,这可能会给您的应用用户带来严重的安全漏洞.
在为您的应用提交下一个更新以供审核之前,请对您的应用进行深入审核并删除符合上述功能的所有代码,框架或SDK.
编辑:Apple论坛提到:https://forums.developer.apple.com/thread/73640
在我的应用程序中,我需要提供一个视图控制器.用于呈现视图控制器的6.0方法是presentViewController:animated:completion:.我也想支持4.3.在4.3中,要调用的方法是presentModalViewController:animated:.所以我使用respondsToSelector:来确定该方法是否受支持.但是当我为6.0编译应用程序时,它会发出警告消息
presentModalViewController:animated:不推荐使用:首先在iOS 6.0中弃用
任何人都可以知道如何摆脱这个警告.我也没有4.3设备来测试它是否有效.我需要假设我编写的代码应该适用于4.3.
if([myViewController respondsToSelector:@selector(presentModalViewController:animated:)]){
[myViewController presentModalViewController:anotherViewController animated:YES];
}else{
[myViewController presentViewController:anotherViewController animated:YES completion:nil];
}
Run Code Online (Sandbox Code Playgroud) 如何执行运行时检查以查看是否可以使用UIGraphicsBeginImageContextWithOptions,仅从iOS 4开始提供.
我知道我可以检查[[UIDevice currentDevice] systemVersion],但Apple推荐使用像NSClassFromString()或者之类的东西respondsToSelector:.是否有respondsToSelector:对C函数?
我目前面临的问题是检查对象(NSManagedObject)的属性是否存在.
不幸的是方法
[[MyObject class] respondsToSelector:@selector(myProperty)];
Run Code Online (Sandbox Code Playgroud)
总是返回NO.
我认为这是因为CoreData生成的属性是一个新的样式属性ala
@property (nonatomic, strong) NSString *myProperty
Run Code Online (Sandbox Code Playgroud)
那么任何想法如何解决这个问题?
我非常感谢你的所有建议;)
提前致谢!亚历克斯
我是iOS世界的新手,在尝试将值从TableView传递回家庭控制器时遇到了问题.
我正在研究的方案是
真的很感激这个问题的任何指针:
这就是我为Segue on Home做准备的方式
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
UIViewController *destination = segue.destinationViewController;
if ([destination respondsToSelector:@selector(setDelegate:)]) {
[destination setValue:self forKey:@"delegate"];
}
}
Run Code Online (Sandbox Code Playgroud)
SecondController有一个委托id,所以我假设委托被设置为" respondsToSelector"为"setDelegate"返回true
现在,在SecondController当用户选择了我称之为项目didSelectRowAtIndexPath和viewWillDisappear方法来设置项目,使视野中消失:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
POSAllItemsCell *cell = (POSAllItemsCell *) [tableView cellForRowAtIndexPath:indexPath];
item = [NSDictionary dictionaryWithObjectsAndKeys:cell.name, @"Name", cell.price, @"Price", cell.code, @"Code", nil];
[self dismissViewControllerAnimated:YES completion:NULL];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
if ([delegate respondsToSelector:@selector(setSelection:)]) {
[delegate setValue:item forKey:@"selection"];
}
}
Run Code Online (Sandbox Code Playgroud)
现在,这里的问题是, …
我是几天前从Objective-C编写的Swift语言,在项目中我遇到了一个问题.这个问题是在使用respondsToSelector("testEnum:")函数检查是否实现testEnum的函数时: param就是这样,它会返回false,我试过其他类型,它会返回true,不知道是什么原因,看下面的代码,帮我解决一下,非常感谢你!
enum TestEnum {
case A
case B
case C
}
protocol TestAProtocol: NSObjectProtocol {
func testEnum(testEnum: TestEnum);
func testInt(testInt: Int);
}
class TestA: NSObject {
var delegate: TestAProtocol?;
func executeDelegateCallBack() {
if (delegate != nil && delegate!.respondsToSelector(Selector("testEnum:"))) { // delegate!.respondsToSelector(Selector("testEnum:")) return false ?
delegate?.testEnum(TestEnum.A);
}
if (delegate != nil && delegate!.respondsToSelector(Selector("testInt:"))) { // delegate!.respondsToSelector(Selector("testInt:")) return true ?
delegate?.testInt(0);
}
}
}
class TestB: NSObject, TestAProtocol {
func initTestB () {
let testA: TestA = TestA();
testA.delegate = self; …Run Code Online (Sandbox Code Playgroud)