【问题标题】:Check if a Method has been Called [closed]检查是否已调用方法[关闭]
【发布时间】:2014-05-30 03:08:22
【问题描述】:

Objective C 中是否有任何方法、类或任何东西可以检测或可以检测方法是否已被调用?所以,我可以把它写在我的 if 语句中。

【问题讨论】:

  • 在什么情况下?您可以在调试器的方法中放置断点。您可以添加一个日志语句,例如调用NSLog()printf 或其他任何内容。

标签: objective-c ios7 methods


【解决方案1】:

如果您拥有该方法的实现,您可以使用NSNotificationCenter 在您进入和退出该方法时发布通知。我不久前做了something like this,但为了更改属性。你可以实现基本相同的东西。

标题

创建只公开专用初始化程序的 API,我们提供我们正在监视的对象以及我们希望在对象发生属性更改时调用的方法。如果您愿意,可以重写它以使用代码块。我是在深入研究代码块之前写的。

#import <Foundation/Foundation.h>

@interface ObjectMonitor : NSObject

- (id)initWithMonitoringObject:(NSObject *)objectToMonitor respondingWithSelector:(SEL)selector;

@end

实施

现在您只需实现专用初始化程序,它将对象属性分解为一个集合并将自己注册为 KVO 观察者。然后,只要objectToMonitor 中的任何属性发生变化,observeValueForKeyPath 方法就会被触发。

#import "ObjectMonitor.h"
#import <objc/objc-runtime.h>

@interface ObjectMonitor ()
@property (nonatomic) SEL selector;
@end

@implementation ObjectMonitor

- (id)initWithMonitoringObject:(NSObject *)objectToMonitor respondingWithSelector:(SEL)selector {
    self = [super init];

    if (self) {
        self.selector = selector;

        unsigned int count;
        objc_property_t *properties = class_copyPropertyList([objectToMonitor class], &count);

        for (size_t i = 0; i < count; ++i) {
            NSString *key = [NSString stringWithUTF8String:property_getName(properties[i])];
            [objectToMonitor addObserver:self forKeyPath:key
                  options:0 context:NULL];
        }

        free(properties);
    }
    return self;
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    NSLog(@"%@ had %@ changed!", NSStringFromClass([object class]), keyPath);

    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[[object class] instanceMethodSignatureForSelector:self.selector]];
    if (invocation) {
        invocation.target = object;
        invocation.selector = self.selector;
        @try {
            [invocation invoke];
        }
        @catch (NSException *exception) {
            NSLog(@"Failed to invoke the method");
        }
        @finally {

        }
    } else {
        NSLog(@"ERROR: Failed to locate the method for @selector:%@", NSStringFromSelector(self.selector));
    }
}
@end

示例用法

实例化 ObjectMonitor,将方法回调关联到它,你就可以开始了。 savePlayerSettings 方法将在MYPlayerSettings 内的任何属性发生更改时调用

#import "MYPlayerSettings.h"
#import "ObjectMonitor.h"

@interface MYPlayerSettings ()
@property (strong, nonatomic) ObjectMonitor *objectMonitor;
@end

@implementation MYPlayerSettings

-(id)init {
    self = [super init];
    if (self) {
        self.objectMonitor = [[ObjectMonitor alloc]
                              initWithMonitoringObject:self
                              respondingWithSelector:@selector(playerSettingsChanged)];
    }
    return self;

- (void)playerSettingsChanged {
    NSLog(@"%@ had settings changed", self.name);
}

我知道你想在方法调用时收到通知,但是你可以通过传入你想调用的方法来稍微修改一下,然后在每次方法被触发时将一个专用的 NSString 属性更改为方法。然后在您的回调处理程序中,根据更改的值检查触发了什么方法,并做出相应的反应。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 2014-08-29
    • 2012-01-29
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多