标签: respondstoselector

Objective-C:为什么在respondsToSelector之前检查nil:?

我见过代码如下:

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吗?无论哪种方式,我更喜欢后者,因为它的代码更少.

并且,lessmore.每个Unix专业人员都知道.

null objective-c nsobject respondstoselector

27
推荐指数
2
解决办法
4131
查看次数

super respondsToSelector:返回true但实际上调用super(selector)给出"无法识别的选择器发送到实例"

好的,我有点困惑.

我有一个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] - [MyAppHorizo​​ntalImageScroller gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:]:无法识别的选择器发送到实例0x21dd50

我本以为应该表明

- [UIScrollView gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:]

但那可能没问题.但问题是,它说它响应然后不响应.

另外两个UIGestureRecognizer委托例程使用此代码(显然是不同的选择器).

感谢您的任何见解.

delegates objective-c super uigesturerecognizer respondstoselector

19
推荐指数
3
解决办法
4923
查看次数

(ConformsToProtocol:&& RespondsToSelector:)vs just(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的东西:谢谢

delegates protocols objective-c selector respondstoselector

7
推荐指数
2
解决办法
4039
查看次数

你怎么知道是否在Objective C中调用超类方法

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)

objective-c super respondstoselector

6
推荐指数
1
解决办法
868
查看次数

App Store是否禁止performSelector和respondsToSelector?

我的最新版本被苹果应用程序商店接受了,但几天之后我收到了下面引用的通知.

我的应用程序也使用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

app-store ios respondstoselector

6
推荐指数
1
解决办法
1789
查看次数

iOS版本检查发出警告

在我的应用程序中,我需要提供一个视图控制器.用于呈现视图控制器的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)

iphone objective-c ios respondstoselector

5
推荐指数
1
解决办法
143
查看次数

Objective-C:如何检查是否支持C函数

如何执行运行时检查以查看是否可以使用UIGraphicsBeginImageContextWithOptions,仅从iOS 4开始提供.

我知道我可以检查[[UIDevice currentDevice] systemVersion],但Apple推荐使用像NSClassFromString()或者之类的东西respondsToSelector:.是否有respondsToSelector:对C函数?

iphone cocoa-touch objective-c respondstoselector

4
推荐指数
1
解决办法
972
查看次数

Objective C - respondsToSelector用于动态属性

我目前面临的问题是检查对象(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)

那么任何想法如何解决这个问题?

我非常感谢你的所有建议;)

提前致谢!亚历克斯

objective-c ios dynamic-properties respondstoselector

4
推荐指数
1
解决办法
5621
查看次数

respondsToSelector:不为委托工作

我是iOS世界的新手,在尝试将值从TableView传递回家庭控制器时遇到了问题.

我正在研究的方案是

  1. Home Controller有一个按钮
  2. 单击按钮可打开第二个UIViewController中的项目列表
  3. 用户从列表中选择一个项目
  4. 所选项目将添加到Home Controller上的另一个列表中

真的很感激这个问题的任何指针:

这就是我为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当用户选择了我称之为项目didSelectRowAtIndexPathviewWillDisappear方法来设置项目,使视野中消失:

- (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 ios ios5 respondstoselector

4
推荐指数
1
解决办法
2万
查看次数

为什么delegate.respondsToSelector(Selector("testEnum:"))这段代码会以快速语言返回false?

我是几天前从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)

enums ios respondstoselector swift

3
推荐指数
1
解决办法
825
查看次数