【发布时间】:2014-05-30 03:08:22
【问题描述】:
Objective C 中是否有任何方法、类或任何东西可以检测或可以检测方法是否已被调用?所以,我可以把它写在我的 if 语句中。
【问题讨论】:
-
在什么情况下?您可以在调试器的方法中放置断点。您可以添加一个日志语句,例如调用
NSLog()或printf或其他任何内容。
标签: objective-c ios7 methods
Objective C 中是否有任何方法、类或任何东西可以检测或可以检测方法是否已被调用?所以,我可以把它写在我的 if 语句中。
【问题讨论】:
NSLog() 或printf 或其他任何内容。
标签: objective-c ios7 methods
如果您拥有该方法的实现,您可以使用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 属性更改为方法。然后在您的回调处理程序中,根据更改的值检查触发了什么方法,并做出相应的反应。
希望这会有所帮助。
【讨论】: