aboutsummaryrefslogtreecommitdiffstats
path: root/Source/SPObjectAdditions.m
diff options
context:
space:
mode:
Diffstat (limited to 'Source/SPObjectAdditions.m')
-rw-r--r--Source/SPObjectAdditions.m128
1 files changed, 14 insertions, 114 deletions
diff --git a/Source/SPObjectAdditions.m b/Source/SPObjectAdditions.m
index 9f51d652..bf8210ea 100644
--- a/Source/SPObjectAdditions.m
+++ b/Source/SPObjectAdditions.m
@@ -29,8 +29,6 @@
// More info at <https://github.com/sequelpro/sequelpro>
#import <objc/runtime.h>
-static NSMutableDictionary *gScrollViewListeners;
-static NSMutableDictionary *gScrollViewDealloc;
@implementation NSObject (SPObjectAdditions)
@@ -46,143 +44,45 @@ static NSMutableDictionary *gScrollViewDealloc;
return (self == null);
}
-- (void)_scrollViewDidChangeBounds:(id)obj
+- (BOOL)isInArray:(NSArray *)list
{
- NSMutableString *msg = [NSMutableString string];
-
- [msg appendFormat:@"%s tripped!\n\n",__PRETTY_FUNCTION__];
-
-retryDescribe:
- [msg appendFormat:@"passed object (class <%@>): %@\n\n",[obj className],obj];
-
- if ([obj isKindOfClass:[NSNotification class]]) {
- NSNotification *notif = (NSNotification *)obj;
- [msg appendFormat:@"unwrapping NSNotification named '%@' (userInfo=%@)\n\n",
- [notif name],
- [notif userInfo]];
- obj = [notif object];
- goto retryDescribe;
- }
-
- if([obj isKindOfClass:[NSView class]]) {
- [msg appendString:@"View hierarchy (parents):\n"];
- id parent = obj;
- while(parent) {
- [msg appendFormat:@"- %p (class <%@>): %@, id=%@, tag=%ld\n",
- parent,
- [parent className],
- parent,
- [(NSView *)parent identifier],
- [(NSView *)parent tag]];
- parent = [parent superview];
- }
- [msg appendString:@"\n"];
-
- [msg appendString:@"View hierarchy (own children): \n"];
- for (id child in [(NSView *)obj subviews]) {
- [msg appendFormat:@"- %p (class <%@>): %@, id=%@, tag=%ld\n",
- child,
- [child className],
- child,
- [(NSView *)child identifier],
- [(NSView *)child tag]];
- }
- [msg appendString:@"\n"];
- }
-
- if([obj respondsToSelector:@selector(window)]) {
- [msg appendFormat:@"In Window: %@\n\n",[obj window]];
- }
-
- [msg appendFormat:@"self: %p (class <%@>)\n\n",self,[self className]];
-
- NSString *key = [NSString stringWithFormat:@"snd=%p,obs=%p",obj,self];
-
- [msg appendFormat:@"registration info for pair (%@):\n %@\n\n",key,[gScrollViewListeners objectForKey:key]];
-
- NSString *deallocKey = [NSString stringWithFormat:@"=%p",self];
- [msg appendFormat:@"self %@ was originally dealloc'ed at:\n %@",deallocKey,[gScrollViewDealloc objectForKey:deallocKey]];
-
- @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:msg userInfo:nil];
+ return [list containsObject:self];
}
@end
+#pragma mark -
-@implementation NSNotificationCenter (SPScrollViewDebug)
+@interface NSAlert (ApplePrivate)
-+ (void)load
-{
- static dispatch_once_t onceToken;
-
- dispatch_once(&onceToken, ^{
- gScrollViewListeners = [[NSMutableDictionary alloc] init];
-
- Class notificationCenter = [self class];
-
- SEL orig = @selector(addObserver:selector:name:object:);
- SEL exch = @selector(sp_addObserver:selector:name:object:);
-
- Method origM = class_getInstanceMethod(notificationCenter, orig);
- Method exchM = class_getInstanceMethod(notificationCenter, exch);
-
- method_exchangeImplementations(origM, exchM);
- });
-
-}
-
-- (void)sp_addObserver:(id)notificationObserver selector:(SEL)notificationSelector name:(NSString *)notificationName object:(id)notificationSender
-{
- if(notificationSelector == @selector(_scrollViewDidChangeBounds:) && [notificationName isEqualToString:NSViewBoundsDidChangeNotification]) {
- NSString *key = [NSString stringWithFormat:@"snd=%p,obs=%p",notificationSender,notificationObserver];
- NSMutableString *val = [NSMutableString string];
- [val appendFormat:@"observer: %1$p (class %2$@) description: %1$@\n",notificationObserver,[notificationObserver className]];
- if([notificationObserver isKindOfClass:[NSView class]]) {
- [val appendFormat:@" view info: id=%@, tag=%ld\n",[(NSView *)notificationObserver identifier], [(NSView *)notificationObserver tag]];
- }
- [val appendFormat:@"\nbacktrace:\n%@\n\n",[NSThread callStackSymbols]];
-
- [gScrollViewListeners setObject:val forKey:key];
- }
- // not recursive! method is swizzled.
- [self sp_addObserver:notificationObserver selector:notificationSelector name:notificationName object:notificationSender];
-}
+- (IBAction)buttonPressed:(id)sender;
@end
-#import "SPTableView.h"
-
-@implementation SPTableView (SPScrollViewDebug)
+@implementation NSAlert (SPAlertDebug)
+ (void)load
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
- gScrollViewDealloc = [[NSMutableDictionary alloc] init];
+ Class alertClass = [self class];
- Class tableView = [self class];
+ SEL orig = @selector(buttonPressed:);
+ SEL exch = @selector(sp_buttonPressed:);
- SEL orig = @selector(dealloc);
- SEL exch = @selector(sp_dealloc);
-
- Method origM = class_getInstanceMethod(tableView, orig);
- Method exchM = class_getInstanceMethod(tableView, exch);
+ Method origM = class_getInstanceMethod(alertClass, orig);
+ Method exchM = class_getInstanceMethod(alertClass, exch);
method_exchangeImplementations(origM, exchM);
});
}
-- (void)sp_dealloc
+- (IBAction)sp_buttonPressed:(id)obj
{
- NSString *key = [NSString stringWithFormat:@"=%p",self];
- NSString *val = [NSString stringWithFormat:@"\ndealloc backtrace:\n%@\n\n",[NSThread callStackSymbols]];
-
- [gScrollViewDealloc setObject:val forKey:key];
+ NSLog(@"%s of %@ title=\n%@\ntext=\n%@",__func__,self,[self messageText],[self informativeText]);
- // not recursive! method is swizzled.
- [self sp_dealloc];
+ [self sp_buttonPressed:obj];
}
-
@end