[ios]访问委托静态方法在objective-c 问题

发布时间: 2017/3/23 3:39:06
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有一个奇怪的问题在objective-c。下面是代码︰

STViewController.h

#import <UIKit/UIKit.h>
@interface STViewController : UIViewController <UIAlertViewDelegate>
+(void)myStaticMethod;
@end

STViewController.m

#import "STViewController.h"

@implementation STViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    [STViewController myStaticMethod];
}

+ (void)myStaticMethod {
    UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Foo bar"
                                                    message:@"baz bat"
    //what does self even mean in this context? The class object STViewController?
                                                   delegate:self
                                          cancelButtonTitle:@"Cancel"
                                          otherButtonTitles:@"OK", nil];
    [alert show];
    [alert release];
}

#pragma mark UIAlertViewDelegate

// TRICKY PART if it's static it works, if it's not, it doesn't.
// even though the protocol declares instance methods (with a minus).
+ (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    NSLog(@"It works!");
}

@end

为什么会这样?这是正确的吗?我收到任何错误或警告。是否-/ + Protocol方法声明中做某事吗?

解决方法 1:

首先,你要知道, Class (通常得到 [MyClass class] ) 对象也是一个有效的陈寿对象。这意味着,您可以对类对象以及发送消息。

举个例子

@interface MyClass : NSObject
+ (NSString *)name;
@end

@implementation MyClass
+ (NSString *)name {
    return NSStringFromClass(self); // note in class method, self == [MyClass class]
}
@end

// ------- in some method

id cls = [MyClass class]; // the correct type should be Class, but since Class is an object, id will also work
NSLog(@"%@", [cls name]); // call like instance method - MyClass
NSLog(@"%@", [MyClass name]); // call like class method - MyClass

所以你可以使用你像其他对象的类对象,并调用类方法像实例方法一样。

和类方法实际上是实例方法!!不同的是,类方法的元类,这是类的实例方法的 Class .更多关于元类︰ http://www.cocoawithlove.com/2010/01/what-is-meta-class-in-objective-c.html


此外,您的类接口是不正确的因为它是不可能 (至少在编译器时) 向一个元类添加一个Protocol。所以,如果你做 [self conformsToProtocol:@protocol(UIAlertViewDelegate)] 将返回号但你执行 + alertView:clickedButtonAtIndex: ,将添加此方法作为元类的实例方法,因此委托代码工作和 [self responseToSelector:@selector(alertView:clickedButtonAtIndex:)] 将返回 YES。

官方微信
官方QQ群
31647020