diff options
Diffstat (limited to 'Source/SPObjectAdditions.m')
-rw-r--r-- | Source/SPObjectAdditions.m | 128 |
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 |