diff --git a/NativeZWRChecker/NativeZWRCheckeriPhone-Info.plist b/NativeZWRChecker/NativeZWRCheckeriPhone-Info.plist
new file mode 100755
index 0000000..590b926
--- /dev/null
+++ b/NativeZWRChecker/NativeZWRCheckeriPhone-Info.plist
@@ -0,0 +1,47 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleDisplayName
+ ${PRODUCT_NAME}
+ CFBundleExecutable
+ ${EXECUTABLE_NAME}
+ CFBundleIconFiles
+
+ CFBundleIdentifier
+ com.mikeash.${PRODUCT_NAME:rfc1034identifier}
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ ${PRODUCT_NAME}
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ 1.0
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ 1.0
+ LSRequiresIPhoneOS
+
+ UIRequiredDeviceCapabilities
+
+ armv7
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+
+
diff --git a/NativeZWRChecker/main.m b/NativeZWRChecker/main.m
new file mode 100755
index 0000000..1a24884
--- /dev/null
+++ b/NativeZWRChecker/main.m
@@ -0,0 +1,175 @@
+//
+// main.m
+// NativeZWRCheckeriPhone
+//
+// Created by Michael Ash on 10/15/11.
+// Copyright (c) 2011 __MyCompanyName__. All rights reserved.
+//
+
+#import
+#import
+
+#import
+#import
+#import
+#import
+#import
+#import
+
+
+@implementation NSObject (HackHackHackYourBoat)
+
+- (BOOL)_isDeallocating { return NO; }
+
+@end
+
+static void Check(void)
+{
+ [NSAutoreleasePool new];
+
+ char *badClassNames[] = {
+ "NSProxy",
+ "__NSPlaceholderArray",
+ "NSSubrangeData",
+ "NSJSONSerialization",
+ "NSCGImageSnapshotRep",
+ "FEOpenCLContext",
+ "_PFEncodedData",
+ "NSPropertyListSerialization",
+ "FEContext",
+ "NSPersistentStore",
+ "HICocoaWindowAdapter",
+ "NSApplication",
+ "NSCachedImageRep",
+ "NSCIImageRep",
+ "NSCGImageRep",
+ "NSPasteboard",
+ "NSFileVersion",
+ "NSIconRefImageRep",
+ "NSIconRefBitmapImageRep",
+ "NSColorPanel",
+ "NSFontDescriptor",
+ "NSKnownKeysDictionary",
+ "__NSPlaceholderSet",
+ "NSCustomImageRep",
+ "_NSTemporaryObjectID2",
+ "NSTemporaryObjectID",
+ "NSKeyedUnarchiver",
+ "NSPICTImageRep",
+ "_NSZombie_",
+ "NSKnownKeysMappingStrategy2",
+ "__NSGenericDeallocHandler",
+ "NSPDFImageRep",
+ "NSMessageBuilder",
+ "NSDistributedLock",
+ "NSKeyedArchiver",
+ "__CFNotification",
+ "NSNavFBETopLevelNode",
+ "Protocol",
+ "NSTreeNode",
+ "NSBitmapImageRep",
+ "NSNotification",
+ "NSDocumentRevisionsPlaceholderView",
+ "__NSPlaceholderDictionary",
+ "DDNonTerminal",
+ "NSAtomicStoreCacheNode",
+ "NSViewTemplate",
+ "__NSPlaceholderOrderedSet",
+ "Object",
+ "NSLeafProxy",
+ "__IncompleteProtocol",
+ "NSHTTPCookie",
+ "_PFEncodedString",
+ "NSEPSImageRep",
+ "_PFEncodedArray",
+ "DOMObject",
+ "UIProgressBar",
+ "UIWebTextView",
+ "BasicAccount",
+ "UIWebBrowserView",
+ "UIPasteboard",
+ "_UIDefinitionService",
+ "_UIDateLabelCache",
+ "ABPersonLinker",
+ "WebInspectorWindowController",
+ "UIPrintInteractionController",
+ "_TMBlockDebugger",
+ "UIDocument",
+ "UISplitViewController",
+ "MCDependencyManager",
+ "DADConnection",
+ "UIApplication",
+ "UIPrintInfo",
+ "UIPopoverController",
+ "UIURLResolver",
+ "NSSpeechSynthesizer"
+ };
+
+ void (*NSApplicationLoadFptr)(void) = dlsym(RTLD_DEFAULT, "NSApplicationLoad");
+ if(NSApplicationLoadFptr)
+ NSApplicationLoadFptr();
+
+ int count = objc_getClassList(NULL, 0);
+ Class *classes = malloc(count * sizeof(*classes));
+ objc_getClassList(classes, count);
+
+ NSMutableArray *results = [NSMutableArray array];
+
+ fprintf(stderr, "starting...\n");
+ for(int i = 0; i < count; i++)
+ {
+ Class c = classes[i];
+
+ BOOL isBad = NO;
+ for(Class toCheck = c; toCheck; toCheck = class_getSuperclass(toCheck))
+ {
+ for(unsigned i = 0; i < sizeof(badClassNames) / sizeof(*badClassNames); i++)
+ {
+ if(strcmp(class_getName(toCheck), badClassNames[i]) == 0)
+ isBad = YES;
+ }
+ }
+ if(isBad)
+ continue;
+
+ id instance = [[c alloc] init];
+
+ BOOL (*allowsWeakReference)(id, SEL);
+ SEL allowsWeakReferenceSEL = @selector(allowsWeakReference);
+ allowsWeakReference = (BOOL (*)(id, SEL))class_getMethodImplementation(c, allowsWeakReferenceSEL);
+ if((IMP)allowsWeakReference != class_getMethodImplementation(c, @selector(thisHadBetterBeUndefinedIReallyHopeSo)))
+ {
+ BOOL allows = allowsWeakReference(instance, allowsWeakReferenceSEL);
+ if(!allows)
+ {
+ const char *name = class_getName(c);
+ NSMutableData *sha = [NSMutableData dataWithLength: CC_SHA1_DIGEST_LENGTH];
+ CC_SHA1(name, (int)strlen(name), [sha mutableBytes]);
+
+ NSDictionary *d = [NSDictionary dictionaryWithObjectsAndKeys:
+ sha, @"sha",
+ [NSString stringWithUTF8String: name], @"name",
+ nil];
+ [results addObject: d];
+ }
+ }
+ }
+ fprintf(stderr, "done!\n");
+
+ NSData *data = [NSPropertyListSerialization dataFromPropertyList: results format: NSPropertyListXMLFormat_v1_0 errorDescription: NULL];
+ [[NSFileHandle fileHandleWithStandardOutput] writeData: data];
+}
+
+int main(int argc, char *argv[])
+{
+ int (*UIApplicationMainFptr)(int, char **, void *, void *) = dlsym(RTLD_DEFAULT, "UIApplicationMain");
+ if(UIApplicationMainFptr)
+ {
+ dispatch_async(dispatch_get_main_queue(), ^{ Check(); });
+ UIApplicationMainFptr(argc, argv, NULL, NULL);
+ }
+ else
+ {
+ Check();
+ }
+}
diff --git a/NativeZWRChecker/sourcedumper.py b/NativeZWRChecker/sourcedumper.py
new file mode 100755
index 0000000..1a01d41
--- /dev/null
+++ b/NativeZWRChecker/sourcedumper.py
@@ -0,0 +1,1168 @@
+#!/usr/bin/python
+
+iOSPlist = """
+
+
+
+
+ name
+ __NSOperationInternal
+ sha
+
+ ROSeGwWpNKnZxacFFj1PFUGoRSQ=
+
+
+
+ name
+ __NSStackBlock__
+ sha
+
+ 3papHp41j4ZHdNNrNkFTcEBSr8s=
+
+
+
+ name
+ NSPort
+ sha
+
+ We3vJYzFNeejp1rM03UIQ7IK7rI=
+
+
+
+ name
+ NSMachPort
+ sha
+
+ sEAJodm0DwS2BNbVe53fngii5Lc=
+
+
+
+ name
+ NSMessagePort
+ sha
+
+ VHdluyievZ9dDDlwW+dlzDzMSgY=
+
+
+
+ name
+ __NSFinalizingBlock__
+ sha
+
+ 3AZZFtRa6m+OCKyJrAtzLGJn/wA=
+
+
+
+ name
+ NSBlock
+ sha
+
+ BQpaL8Om1fvPzIXyL+oW67/PnlI=
+
+
+
+ name
+ __NSStackBlock
+ sha
+
+ zRs7gD8UnN6tGEvpRLoBXwiY1ow=
+
+
+
+ name
+ __NSAutoBlock
+ sha
+
+ lyAIsod346R+vjRvhCmmISp/zA4=
+
+
+
+ name
+ __NSFinalizingBlock
+ sha
+
+ jjw57/tev/xpn9vXTJevn8e/5wU=
+
+
+
+ name
+ __NSAutoBlock__
+ sha
+
+ sX6EDSOPeVb/kkB2sGuBdpYPwQo=
+
+
+
+ name
+ _CTNativeGlyphStorage
+ sha
+
+ Tqpn+KXIPhk/wAlZeVGgjuv7dyY=
+
+
+
+"""
+
+MacPlist = """
+
+
+
+
+ name
+ NSWindow
+ sha
+
+ SFeMN8U0BSGJXEsVB5y4/3tu8a4=
+
+
+
+ name
+ NSDrawerWindow
+ sha
+
+ /NgSMV9gYZR7dN7V+TRqUf8W7x4=
+
+
+
+ name
+ NSNavAdvancedSearchController
+ sha
+
+ TbJhqXch7kQchtzNaHxvbfKT7R4=
+
+
+
+ name
+ NSFindPanel
+ sha
+
+ zYGpaERs/FtA/hC0w04Z/VdobMs=
+
+
+
+ name
+ NSCarbonWindow
+ sha
+
+ ahavRAEYXohNEBwmK/fK9AkLJI4=
+
+
+
+ name
+ NSSecureTextView
+ sha
+
+ LbaEa2rmSFa0uK4Jj4jUn3GNK/Q=
+
+
+
+ name
+ __NSAutoBlock
+ sha
+
+ lyAIsod346R+vjRvhCmmISp/zA4=
+
+
+
+ name
+ NSViewHierarchyLock
+ sha
+
+ CIJQZlV2mLW4ViDWHAdVTjLgsTM=
+
+
+
+ name
+ NSBlock
+ sha
+
+ BQpaL8Om1fvPzIXyL+oW67/PnlI=
+
+
+
+ name
+ NSFontPanel
+ sha
+
+ vqtJfV9j/tynQ0OtJIBs6zYE0ps=
+
+
+
+ name
+ __NSStackBlock
+ sha
+
+ zRs7gD8UnN6tGEvpRLoBXwiY1ow=
+
+
+
+ name
+ NSFindPatternFieldEditor
+ sha
+
+ rXX5qhv5U5M14xaY/H7l7JvKZO8=
+
+
+
+ name
+ _PFManagedObjectReferenceQueue
+ sha
+
+ UrTPGUe41WVWdcBG1Dya8iEvxco=
+
+
+
+ name
+ __NSFinalizingBlock
+ sha
+
+ jjw57/tev/xpn9vXTJevn8e/5wU=
+
+
+
+ name
+ NSTableOptionsPanel
+ sha
+
+ Qm66oEUVhjdLMEgOe68K0nVDEPs=
+
+
+
+ name
+ NSColorPopoverController
+ sha
+
+ VKRPkoniO0lucOF1kHm7U19PzD4=
+
+
+
+ name
+ NSLazyBrowserCell
+ sha
+
+ /9eaS5QRt7u4JU00YIBG3DqV7eM=
+
+
+
+ name
+ NSTableOptions
+ sha
+
+ CRF7IZAowDmQm8WpD68IQ565ncM=
+
+
+
+ name
+ NSStringDrawingTextStorage
+ sha
+
+ SgzNnuoeiuoPAPPnM7FvW0JVVUU=
+
+
+
+ name
+ _NSFullScreenWindow
+ sha
+
+ gxE/KY51+hnKgl8M5kBgmaXMsNU=
+
+
+
+ name
+ _NSMagnifierWindow
+ sha
+
+ 6FjBniKPQyf85Jf7Jusye6+DwYk=
+
+
+
+ name
+ _NSCachedAttributedString
+ sha
+
+ q+3V5uisAQ0gV39x/RjMaXIKHUI=
+
+
+
+ name
+ _NSNonretainedFullScreenWindow
+ sha
+
+ puhB56xY9iFkgq2oZRpUWIzTVKA=
+
+
+
+ name
+ NSSubTextStorage
+ sha
+
+ b8VsLCw34olyVrN9ti1nTNBfVcE=
+
+
+
+ name
+ NSCorrectionSubPanel
+ sha
+
+ GkQ7kZTSNF5KGNlxFyzE+lpxTLU=
+
+
+
+ name
+ NSToolTipPanel
+ sha
+
+ lp+Z+UkqDP4ITu3UK2k57xK6GAI=
+
+
+
+ name
+ NSTokenTextView
+ sha
+
+ Ttf83RkW7X6eg44lXKbmDuE2w7E=
+
+
+
+ name
+ NSTextTab
+ sha
+
+ f7VofsahuBSzG9Lszpk+A3IdF84=
+
+
+
+ name
+ NSAccessoryWindow
+ sha
+
+ Q6z7uarex+PgkTJgrf7SRP51vGs=
+
+
+
+ name
+ NSCorrectionPanel
+ sha
+
+ HJDf026wh9bEpDPZn/neafSAffQ=
+
+
+
+ name
+ NSFontManager
+ sha
+
+ 3ZSbDioAG3dNHOYikR0AxPJRqnc=
+
+
+
+ name
+ NSPrintPreviewController
+ sha
+
+ anKU3rnEk4bMiB4Di39yfFGW+7o=
+
+
+
+ name
+ NSISObjectiveVariable
+ sha
+
+ Bw9S7Pex5Sp8OdRhF3Ymjnpcj7I=
+
+
+
+ name
+ NSPort
+ sha
+
+ We3vJYzFNeejp1rM03UIQ7IK7rI=
+
+
+
+ name
+ NSMachPort
+ sha
+
+ sEAJodm0DwS2BNbVe53fngii5Lc=
+
+
+
+ name
+ NSParagraphStyle
+ sha
+
+ dvUt4yMQmGGsWZlZ2j2NpgpnN8A=
+
+
+
+ name
+ NSMutableParagraphStyle
+ sha
+
+ +iyzpRrhoAOUQuJsqqH4I7ISjv0=
+
+
+
+ name
+ NSMessagePort
+ sha
+
+ VHdluyievZ9dDDlwW+dlzDzMSgY=
+
+
+
+ name
+ NSExceptionAlertController
+ sha
+
+ lR/CLWuBi8ZtYomSaF9LVHS8G0M=
+
+
+
+ name
+ NSISNonNegativeVariableWithDelegate
+ sha
+
+ GtoRBKxZzliZCAWux59ffB6r8xI=
+
+
+
+ name
+ NSFont
+ sha
+
+ 2xon5Aci9SfDzcgrtiwlQPlGpHM=
+
+
+
+ name
+ NSNavNewFolderController
+ sha
+
+ +YmCkaf8Q+4bA+/MSAgRUZty6RQ=
+
+
+
+ name
+ NSNavProgressErrorViewController
+ sha
+
+ v4NLJvLDJMVkXUyWhu1CHIMFNIw=
+
+
+
+ name
+ _NSBorderlessLayerTreeProjectionWindow
+ sha
+
+ vmYan5nzSrmnsAatwYHf4h4Bi/Q=
+
+
+
+ name
+ NSManagedObjectID
+ sha
+
+ KwHd7qY430VSAaMzGCouFwWWgUo=
+
+
+
+ name
+ NSSavePanel
+ sha
+
+ 8aVWn479HMFaFcUCDVa0G3AQ3wo=
+
+
+
+ name
+ NSISNonNegativeVariableWithDelegateToBeMinimized
+ sha
+
+ kSnm/5yoG3gzXvXW9vM0qSdo3Eg=
+
+
+
+ name
+ NSStatusBarWindow
+ sha
+
+ aDpl8bpqf6f7EuQfUyWtdIgNczA=
+
+
+
+ name
+ _NSSlideAndCrossFadeAnimationProjectionWindow
+ sha
+
+ N29wQ0c/FJv4HlfLQNZU1NFvxl4=
+
+
+
+ name
+ NSPanel
+ sha
+
+ nbOBxM5LSG2AavThMdqNx4OrxaE=
+
+
+
+ name
+ __NSSharedFontInstanceInfo
+ sha
+
+ Hfw+cCmab76aPudWHmQT6Wr9yc0=
+
+
+
+ name
+ _NSDuplicateDocumentAnimationProjectionWindow
+ sha
+
+ k2sV+fK5+4ZCsp12qpo+r0c7S5c=
+
+
+
+ name
+ _NSSavePanelTextView
+ sha
+
+ X8BeiDqxkZz5nRn+eamPekIDfHI=
+
+
+
+ name
+ NSISNonNegativeMarkerVariableToBeMinimized
+ sha
+
+ 87iKzyPmaeh2Qp2xSgKxn4SkOT4=
+
+
+
+ name
+ NSBrowserColumnViewController
+ sha
+
+ 3l09TtZ6XGvnSkwKv75f30g0gOg=
+
+
+
+ name
+ NSExternalRefCountedData
+ sha
+
+ tGkj/ekPJBm3p5Lh7RvRoK5khYc=
+
+
+
+ name
+ NSISNonNegativeVariableToBeMinimized
+ sha
+
+ BYOuxVYFzrPVGOkwt3D0eMmv3VQ=
+
+
+
+ name
+ NSISPureMarkerVariable
+ sha
+
+ 8s5xPyEDG1dlM7/nI02Zghu59jQ=
+
+
+
+ name
+ NSNavProgressStatusViewController
+ sha
+
+ fXYY9mdJ8CfQMRTzzk1ulSaVobk=
+
+
+
+ name
+ NSDockMiniViewWindow
+ sha
+
+ 3ZeRBWfU7XCsylSRUpqDl9InMkU=
+
+
+
+ name
+ NSISNonNegativeVariable
+ sha
+
+ 2QkSOU2kA4sCE0rGWNWeUErwAjY=
+
+
+
+ name
+ __NSFontTypefaceInfo
+ sha
+
+ M0YWTuFHGjKCbq5h7fgOJ6h22gg=
+
+
+
+ name
+ NSCarbonMenuWindow
+ sha
+
+ iegw7vmHI9dVQXH+vWpqCfioqbA=
+
+
+
+ name
+ _NSTextFinderOverlayWindow
+ sha
+
+ wy4SWbpy11FAc+Ph+x6XsMXB5Os=
+
+
+
+ name
+ NSSpellingPanel
+ sha
+
+ IEXWZk7TRqIxvNSRu8Z/r5oW81U=
+
+
+
+ name
+ NSISVariable
+ sha
+
+ PYR5FhTbcicFsSuM7fsf5mWbozI=
+
+
+
+ name
+ NSATSGlyphStorage
+ sha
+
+ B0BGyq1tzEkmPIG4C+chzCjPwyQ=
+
+
+
+ name
+ NSText
+ sha
+
+ wZS0fLqk9TpDBqOEZOv34OC2mFU=
+
+
+
+ name
+ NSNavFilepathInputController
+ sha
+
+ OGBcP6MLw40+BzMeVPPtiCkOr8M=
+
+
+
+ name
+ NSNavProgressWindow
+ sha
+
+ /NR/6hsRv+uSVyNwCRKJr4Si3zE=
+
+
+
+ name
+ NSISNonNegativeMarkerVariable
+ sha
+
+ hF1GmfJvPnDQBwQyaIJdrdtdlok=
+
+
+
+ name
+ __NSOperationInternal
+ sha
+
+ ROSeGwWpNKnZxacFFj1PFUGoRSQ=
+
+
+
+ name
+ NSSingleLineTypesetter
+ sha
+
+ mEoN+Xv4IBzGQEMGB2wU1yUhJbc=
+
+
+
+ name
+ NSISVariableWithDelegate
+ sha
+
+ JJc4QSvnGGdiBd3fwVdZScQWMpQ=
+
+
+
+ name
+ NSNavProgressWindowController
+ sha
+
+ qpt1Mw+o+tqNStZMQxJHTRCywKA=
+
+
+
+ name
+ _NSBrowserTableColumnViewController
+ sha
+
+ H/UmwkD3kRafI04jpP3P4LcSvgU=
+
+
+
+ name
+ NSImage
+ sha
+
+ 98w7UxBrKaYsvbQzj6JGUJ+X5nc=
+
+
+
+ name
+ NSATSTypesetter
+ sha
+
+ 6i+fLL9rpyN+ZHDMdZypvXAs0WY=
+
+
+
+ name
+ _NSPopoverWindow
+ sha
+
+ 7NDJV6/O/hXno6ss2nKurRdFhrE=
+
+
+
+ name
+ NSRulerMarkerPanel
+ sha
+
+ Z66vWYyjSvjpCuh8GEgANLxKaUA=
+
+
+
+ name
+ _NSCoreManagedObjectID
+ sha
+
+ ULIuKpe0CGGpUXIgdL+F5FSzGiQ=
+
+
+
+ name
+ __NSFinalizingBlock__
+ sha
+
+ 3AZZFtRa6m+OCKyJrAtzLGJn/wA=
+
+
+
+ name
+ _NSBrowserPreviewColumnViewController
+ sha
+
+ W4odqX5yXXCBzwzguHOPXIXWoeE=
+
+
+
+ name
+ __NSATSStringSegment
+ sha
+
+ bzQVPTMn4pgVaw3FsAmOiyJAiJw=
+
+
+
+ name
+ _NSBrowserMatrixColumnViewController
+ sha
+
+ Ohkhh6cAV7VU31NQV+eI9oU9XnM=
+
+
+
+ name
+ NSPersistentUIWindowInfo
+ sha
+
+ 5fBFUxrIXWvsMyb2QL5JGKvRHag=
+
+
+
+ name
+ _NSAutomaticFocusRingOverlayWindow
+ sha
+
+ qS/ZwOqufQPYXr5n7l+wYNBXelw=
+
+
+
+ name
+ NSPersistentUIEncodedReference
+ sha
+
+ 3BCrWRJDZBJ54IKz+c079E17lCU=
+
+
+
+ name
+ __NSAutoBlock__
+ sha
+
+ sX6EDSOPeVb/kkB2sGuBdpYPwQo=
+
+
+
+ name
+ NSLineFragmentRenderingContext
+ sha
+
+ rGK8uSbdJD0/xCZHUMa7a1aTFiw=
+
+
+
+ name
+ NSComboBoxWindow
+ sha
+
+ oGMLwra+9sOGRwcO2O//kuUx6QA=
+
+
+
+ name
+ NSProgressPanel
+ sha
+
+ U03ljaFAy3oaJ9OJJDna0UYc8IQ=
+
+
+
+ name
+ _NSFlippedImage
+ sha
+
+ vHs+POfjFBtGd0TbQ8OkuTFmCMc=
+
+
+
+ name
+ NSOpenPanel
+ sha
+
+ 8+tajnD2v0E3iS6US5QjfTRsRrQ=
+
+
+
+ name
+ _NSOrderOutAnimationProxyWindow
+ sha
+
+ d+DVB4OnLn66rGqql0dPtCbo1co=
+
+
+
+ name
+ NSScalarObjectID64
+ sha
+
+ mN/zOpK3GneP90WS0CIYsMzFT5Y=
+
+
+
+ name
+ _NSFullScreenUnbufferedWindow
+ sha
+
+ NcJeItBLWUr+x7IMtY0HS+5KNVI=
+
+
+
+ name
+ NSTableCellView
+ sha
+
+ A1uBQqIOINc58aSoIYYd3KXvCTQ=
+
+
+
+ name
+ NSBasicObjectID
+ sha
+
+ XyJyWRP4cds6vqAbr+12C5rzXtg=
+
+
+
+ name
+ __NSStackBlock__
+ sha
+
+ 3papHp41j4ZHdNNrNkFTcEBSr8s=
+
+
+
+ name
+ NSTextViewCompletionWindow
+ sha
+
+ co0ndJdiBotr7JJRSr1DyKpsWAk=
+
+
+
+ name
+ NSScalarObjectID48
+ sha
+
+ 6IwZlZkW4FMH/eDeHEVEL6Ov7pA=
+
+
+
+ name
+ NSTypeSelectPanel
+ sha
+
+ 5k9PqB+GISss6qvE1SFmTNhboJM=
+
+
+
+ name
+ NSDocumentRevisionsTimelineWindow
+ sha
+
+ Sj7E61aLBYq7vqDbWNJbme8MNsA=
+
+
+
+ name
+ _NSScalarObjectID
+ sha
+
+ EaNh4n2xPuTh0XoNxHRSdrC1frM=
+
+
+
+ name
+ NSNavNodeSharedServerController
+ sha
+
+ N3Kbz1/PiHVyjvFs5chixV/izVw=
+
+
+
+ name
+ NSCollectionViewItem
+ sha
+
+ mLK2tFhdKjwMyCfnbmMHflOyUFk=
+
+
+
+ name
+ NSNavNodePreviewController
+ sha
+
+ 6caXQIAux9K9ydl7IXQjQw/hWnE=
+
+
+
+ name
+ _NSQuickLookWrapperDocumentWindow
+ sha
+
+ D31WdK2TSOK9K1y09vjS/EfA9Lk=
+
+
+
+ name
+ NSColorSpace
+ sha
+
+ lcprGOTF+DWuLMEs3M3sTsp2lAY=
+
+
+
+ name
+ NSPrintPanelOldAccessoryController
+ sha
+
+ fN11drCx/Ms+11Hj9JN41SfCTMQ=
+
+
+
+ name
+ _PFTask
+ sha
+
+ dUvjXLAgFMqMYWDceu4PiBmfp2g=
+
+
+
+ name
+ NSWindowController
+ sha
+
+ fxg65zpHoYZciz2tdOd7o3HOtu0=
+
+
+
+ name
+ NSAttributeDictionary
+ sha
+
+ OikvRNnrgR6JITga0Tb1G7EP4qU=
+
+
+
+ name
+ NSSidebarImage
+ sha
+
+ mlem51SivOYgKEJgkwMUnd/b2k8=
+
+
+
+ name
+ NSViewController
+ sha
+
+ ooON0P+jNonvYry11rt6S/b2sfs=
+
+
+
+ name
+ NSDocumentRevisionsWindow
+ sha
+
+ 0lNAsunn2KqpjFmZAQkrqVqMBKQ=
+
+
+
+ name
+ _NSToolbarDefaultImageRepWindow
+ sha
+
+ 8fXzOOF3REOIBDYCOPz8+6gXTA4=
+
+
+
+ name
+ NSNavPreviewController
+ sha
+
+ 4b+uu16zT6HmTrDXeJa6mVHGFL4=
+
+
+
+ name
+ NSTempAttributeDictionary
+ sha
+
+ 82aVtqcnZnAvxUo45js0DVQhh44=
+
+
+
+ name
+ NSNavSharedServerController
+ sha
+
+ RbjLn+o68uMwnVPFNpVKaVXqhe4=
+
+
+
+ name
+ _NSFullScreenTransitionOverlayWindow
+ sha
+
+ c7HGS1SwVkIm0Az0KCMSN620faw=
+
+
+
+ name
+ NSTextView
+ sha
+
+ bgdKj9Wtpr9iFUmamPuebJopXkU=
+
+
+
+ name
+ PBOXMenuWindow
+ sha
+
+ rg0DJXYfH0VYJbiPqDdy/fW38YU=
+
+
+
+ name
+ NSToolbarConfigPanel
+ sha
+
+ HzqAu6fBQcmlh0Zs6FMPMSzkgu0=
+
+
+
+ name
+ NSLocalWindowWrappingRemoteWindow
+ sha
+
+ TJZzArlE4x8Lr6u68BwcEgC3hr8=
+
+
+
+ name
+ NSToolbarFullScreenWindow
+ sha
+
+ aSDvp1iijMMgobjNdUZA/AWuYQo=
+
+
+
+"""
+
+
+import plistlib
+
+iOSPlist = plistlib.readPlistFromString(iOSPlist)
+MacPlist = plistlib.readPlistFromString(MacPlist)
+
+
+def PrintArray(hashesToNames, indent):
+ indentStr = ' ' * indent * 4
+ for byte in range(256):
+ matching = [x for x in hashesToNames.keys() if x.startswith(chr(byte))]
+ if matching:
+ d = {}
+ for hash in matching:
+ if len(hash) > 1:
+ d[hash[1:]] = hashesToNames[hash]
+ if len(d) > 1:
+ print '%s[0x%x] = { 1, (struct _NativeZWRTableEntry[256]) { // %d' % (indentStr, byte, indent)
+ PrintArray(d, indent + 1)
+ print indentStr + '}},'
+ elif d:
+ hash = d.keys()[0]
+ hashBytes = ['0x%x' % ord(x) for x in hash]
+ hashC = ', '.join(hashBytes)
+ print '%s[0x%x] = { 0, (unsigned char[]){ %s } }, // %s' % (indentStr, byte, hashC, d[hash])
+ else:
+ for hash in matching:
+ print '%s[0x%x] = { 0, &_MAZeroingWeakRefClassPresentToken }, // %s' % (indentStr, byte, hashesToNames[hash])
+
+
+
+hashesToNames = {}
+for x in iOSPlist + MacPlist:
+ hashesToNames[x['sha'].data] = x['name']
+
+print 'static void *_MAZeroingWeakRefClassPresentToken = &_MAZeroingWeakRefClassPresentToken;'
+print 'struct _NativeZWRTableEntry { BOOL isTable; void *ptr; };'
+print 'static struct _NativeZWRTableEntry _MAZeroingWeakRefClassNativeWeakReferenceNotAllowedTable[256] = {'
+PrintArray(hashesToNames, 1)
+print '};'
diff --git a/Source/MANotificationCenterAdditions.h b/Source/MANotificationCenterAdditions.h
old mode 100644
new mode 100755
diff --git a/Source/MANotificationCenterAdditions.m b/Source/MANotificationCenterAdditions.m
old mode 100644
new mode 100755
diff --git a/Source/MAWeakArray.h b/Source/MAWeakArray.h
old mode 100644
new mode 100755
diff --git a/Source/MAWeakArray.m b/Source/MAWeakArray.m
old mode 100644
new mode 100755
diff --git a/Source/MAWeakDictionary.h b/Source/MAWeakDictionary.h
old mode 100644
new mode 100755
diff --git a/Source/MAWeakDictionary.m b/Source/MAWeakDictionary.m
old mode 100644
new mode 100755
diff --git a/Source/MAZeroingWeakProxy.h b/Source/MAZeroingWeakProxy.h
old mode 100644
new mode 100755
diff --git a/Source/MAZeroingWeakProxy.m b/Source/MAZeroingWeakProxy.m
old mode 100644
new mode 100755
diff --git a/Source/MAZeroingWeakRef.h b/Source/MAZeroingWeakRef.h
old mode 100644
new mode 100755
index 1af79ee..c7238e0
--- a/Source/MAZeroingWeakRef.h
+++ b/Source/MAZeroingWeakRef.h
@@ -11,6 +11,7 @@
@interface MAZeroingWeakRef : NSObject
{
id _target;
+ BOOL _nativeZWR;
#if NS_BLOCKS_AVAILABLE
void (^_cleanupBlock)(id target);
#endif
@@ -55,14 +56,14 @@
#if __has_feature(objc_arc_weak)
-#define MAWeakDeclare(var) __weak __typeof__((var)) MAWeakVar(var) = var
-#define MAWeakImport(var) __typeof__((MAWeakVar(var))) var = MAWeakVar(var)
+#define MAWeakDeclare(var) __weak id MAWeakVar(var) = var
+#define MAWeakImport(var) _Pragma("clang diagnostic push") _Pragma("clang diagnostic ignored \"-Wshadow\"") __typeof__(var) var = MAWeakVar(var) _Pragma("clang diagnostic pop")
#define MAWeakImportReturn(var) MAWeakImport(var); do { if(var == nil) return; } while(NO)
#else
#define MAWeakDeclare(var) __typeof__((var)) MAWeakVar(var) = (id)[MAZeroingWeakRef refWithTarget:var]
-#define MAWeakImport(var) __typeof__((MAWeakVar(var))) var = [(MAZeroingWeakRef *)MAWeakVar(var) target]
+#define MAWeakImport(var) _Pragma("clang diagnostic push") _Pragma("clang diagnostic ignored \"-Wshadow\"") __typeof__((MAWeakVar(var))) var = [(MAZeroingWeakRef *)MAWeakVar(var) target] _Pragma("clang diagnostic pop")
#define MAWeakImportReturn(var) MAWeakImport(var); do { if(var == nil) return; } while(NO)
#endif
diff --git a/Source/MAZeroingWeakRef.m b/Source/MAZeroingWeakRef.m
old mode 100644
new mode 100755
index 023e616..2f51a70
--- a/Source/MAZeroingWeakRef.m
+++ b/Source/MAZeroingWeakRef.m
@@ -7,6 +7,10 @@
#import "MAZeroingWeakRef.h"
+#import "MAZeroingWeakRefNativeZWRNotAllowedTable.h"
+
+#import
+
#import
#import
#import
@@ -34,7 +38,7 @@
objects and will assert if trying to make a ZWR to one
*/
#ifndef COREFOUNDATION_HACK_LEVEL
-#define COREFOUNDATION_HACK_LEVEL 1
+#define COREFOUNDATION_HACK_LEVEL 0
#endif
/*
@@ -45,7 +49,20 @@
0 - No hackery, uses the KVO overridden -class to check.
*/
#ifndef KVO_HACK_LEVEL
-#define KVO_HACK_LEVEL 1
+#define KVO_HACK_LEVEL 0
+#endif
+
+/*
+ The USE_BLOCKS_BASED_LOCKING macro allows control on the code structure used
+ during lock checking. You want to disable blocks if you want your app to work
+ on iOS 3.x devices. iOS 4.x and above can use blocks.
+
+ 1 - Use blocks for lock checks.
+
+ 0 - Don't use blocks for lock checks.
+ */
+#ifndef USE_BLOCKS_BASED_LOCKING
+#define USE_BLOCKS_BASED_LOCKING 1
#endif
#if KVO_HACK_LEVEL >= 1
@@ -57,6 +74,8 @@ - (BOOL)_isKVOA;
#endif
+static void EnsureCustomSubclass(id obj);
+
@interface MAZeroingWeakRef ()
- (void)_zeroTarget;
@@ -192,7 +211,6 @@ + (void)initialize
}
}
-#define USE_BLOCKS_BASED_LOCKING 1
#if USE_BLOCKS_BASED_LOCKING
#define BLOCK_QUALIFIER __block
static void WhileLocked(void (^block)(void))
@@ -300,6 +318,26 @@ static void KVOSubclassDealloc(id self, SEL _cmd)
((void (*)(id, SEL))originalDealloc)(self, _cmd);
}
+static void KVOSubclassRemoveObserverForKeyPath(id self, SEL _cmd, id observer, NSString *keyPath)
+{
+ WhileLocked({
+ IMP originalIMP = class_getMethodImplementation(object_getClass(self), @selector(MAZeroingWeakRef_KVO_original_removeObserver:forKeyPath:));
+ ((void (*)(id, SEL, id, NSString *))originalIMP)(self, _cmd, observer, keyPath);
+
+ EnsureCustomSubclass(self);
+ });
+}
+
+static void KVOSubclassRemoveObserverForKeyPathContext(id self, SEL _cmd, id observer, NSString *keyPath, void *context)
+{
+ WhileLocked({
+ IMP originalIMP = class_getMethodImplementation(object_getClass(self), @selector(MAZeroingWeakRef_KVO_original_removeObserver:forKeyPath:context:));
+ ((void (*)(id, SEL, id, NSString *, context))originalIMP)(self, _cmd, observer, keyPath, context);
+
+ EnsureCustomSubclass(self);
+ });
+}
+
#if COREFOUNDATION_HACK_LEVEL >= 3
static void CallCFReleaseLater(CFTypeRef cf)
@@ -465,6 +503,64 @@ static BOOL IsKVOSubclass(id obj)
#endif
}
+// The native ZWR capability table is conceptually a set of SHA1 hashes.
+// Hashes are used instead of class names because the table is large and
+// contains a lot of private classes. Embedding private class names in
+// the binary is likely to cause problems with app review. Manually
+// removing all private classes from the table is a lot of work. Using
+// hashes allows for reasonably quick checks and no private API names.
+// It's implemented as a tree of tables, where each individual table
+// maps to a single byte. The top level of the tree is a 256-entry table.
+// Table entries are a NULL pointer for leading bytes which aren't present
+// at all. Other table entries can either contain a pointer to another
+// table (in which case the process continues recursively), or they can
+// contain a pointer to a single hash. In this second case, this indicates
+// that this hash is the only one present in the table with that prefix
+// and so a simple comparison can be used to check for membership at
+// that point.
+static BOOL HashPresentInTable(unsigned char *hash, int length, struct _NativeZWRTableEntry *table)
+{
+ while(length)
+ {
+ struct _NativeZWRTableEntry entry = table[hash[0]];
+ if(entry.ptr == NULL)
+ {
+ return NO;
+ }
+ else if(!entry.isTable)
+ {
+ return memcmp(entry.ptr, hash + 1, length - 1) == 0;
+ }
+ else
+ {
+ hash++;
+ length--;
+ table = entry.ptr;
+ }
+ }
+ return NO;
+}
+
+static BOOL CanNativeZWRClass(Class c)
+{
+ if(!c)
+ return YES;
+
+ const char *name = class_getName(c);
+ unsigned char hash[CC_SHA1_DIGEST_LENGTH];
+ CC_SHA1(name, strlen(name), hash);
+
+ if(HashPresentInTable(hash, CC_SHA1_DIGEST_LENGTH, _MAZeroingWeakRefClassNativeWeakReferenceNotAllowedTable))
+ return NO;
+ else
+ return CanNativeZWRClass(class_getSuperclass(c));
+}
+
+static BOOL CanNativeZWR(id obj)
+{
+ return CanNativeZWRClass(object_getClass(obj));
+}
+
static Class CreatePlainCustomSubclass(Class class)
{
NSString *newName = [NSString stringWithFormat: @"%s_MAZeroingWeakRefSubclass", class_getName(class)];
@@ -486,15 +582,39 @@ static Class CreatePlainCustomSubclass(Class class)
static void PatchKVOSubclass(Class class)
{
- NSLog(@"Patching KVO class %s", class_getName(class));
+// NSLog(@"Patching KVO class %s", class_getName(class));
+ Method removeObserverForKeyPath = class_getInstanceMethod(class, @selector(removeObserver:forKeyPath:));
Method release = class_getInstanceMethod(class, @selector(release));
Method dealloc = class_getInstanceMethod(class, @selector(dealloc));
+ class_addMethod(class,
+ @selector(MAZeroingWeakRef_KVO_original_removeObserver:forKeyPath:),
+ method_getImplementation(removeObserverForKeyPath),
+ method_getTypeEncoding(removeObserverForKeyPath));
class_addMethod(class, @selector(MAZeroingWeakRef_KVO_original_release), method_getImplementation(release), method_getTypeEncoding(release));
class_addMethod(class, @selector(MAZeroingWeakRef_KVO_original_dealloc), method_getImplementation(dealloc), method_getTypeEncoding(dealloc));
+ class_replaceMethod(class,
+ @selector(removeObserver:forKeyPath:),
+ (IMP)KVOSubclassRemoveObserverForKeyPath,
+ method_getTypeEncoding(removeObserverForKeyPath));
class_replaceMethod(class, @selector(release), (IMP)KVOSubclassRelease, method_getTypeEncoding(release));
class_replaceMethod(class, @selector(dealloc), (IMP)KVOSubclassDealloc, method_getTypeEncoding(dealloc));
+
+ // The context variant is only available on 10.7/iOS5+, so only perform that override if the method actually exists.
+ Method removeObserverForKeyPathContext = class_getInstanceMethod(class, @selector(removeObserver:forKeyPath:context:));
+ if(removeObserverForKeyPathContext)
+ {
+ class_addMethod(class,
+ @selector(MAZeroingWeakRef_KVO_original_removeObserver:forKeyPath:context:),
+ method_getImplementation(removeObserverForKeyPathContext),
+ method_getTypeEncoding(removeObserverForKeyPathContext));
+ class_replaceMethod(class,
+ @selector(removeObserver:forKeyPath:context:),
+ (IMP)KVOSubclassRemoveObserverForKeyPathContext,
+ method_getTypeEncoding(removeObserverForKeyPathContext));
+
+ }
}
static void RegisterCustomSubclass(Class subclass, Class superclass)
@@ -592,9 +712,10 @@ - (id)initWithTarget: (id)target
{
if((self = [self init]))
{
- if(objc_storeWeak_fptr)
+ if(objc_storeWeak_fptr && CanNativeZWR(target))
{
objc_storeWeak_fptr(&_target, target);
+ _nativeZWR = YES;
}
else
{
@@ -607,7 +728,7 @@ - (id)initWithTarget: (id)target
- (void)dealloc
{
- if(objc_storeWeak_fptr)
+ if(objc_storeWeak_fptr && _nativeZWR)
objc_storeWeak_fptr(&_target, nil);
else
UnregisterRef(self);
@@ -630,7 +751,7 @@ - (void)setCleanupBlock: (void (^)(id target))block
[_cleanupBlock release];
_cleanupBlock = block;
- if(objc_loadWeak_fptr)
+ if(objc_loadWeak_fptr && _nativeZWR)
{
// wrap a pool around this code, otherwise it artificially extends
// the lifetime of the target object
@@ -661,7 +782,7 @@ - (void)setCleanupBlock: (void (^)(id target))block
- (id)target
{
- if(objc_loadWeak_fptr)
+ if(objc_loadWeak_fptr && _nativeZWR)
{
return objc_loadWeak_fptr(&_target);
}
diff --git a/Source/MAZeroingWeakRefNativeZWRNotAllowedTable.h b/Source/MAZeroingWeakRefNativeZWRNotAllowedTable.h
new file mode 100755
index 0000000..6d06abe
--- /dev/null
+++ b/Source/MAZeroingWeakRefNativeZWRNotAllowedTable.h
@@ -0,0 +1,180 @@
+static void *_MAZeroingWeakRefClassPresentToken = &_MAZeroingWeakRefClassPresentToken;
+struct _NativeZWRTableEntry { BOOL isTable; void *ptr; };
+static struct _NativeZWRTableEntry _MAZeroingWeakRefClassNativeWeakReferenceNotAllowedTable[256] = {
+ [0x3] = { 0, (unsigned char[]){ 0x5b, 0x81, 0x42, 0xa2, 0xe, 0x20, 0xd7, 0x39, 0xf1, 0xa4, 0xa8, 0x21, 0x86, 0x1d, 0xdc, 0xa5, 0xef, 0x9, 0x34 } }, // NSTableCellView
+ [0x5] = { 1, (struct _NativeZWRTableEntry[256]) { // 1
+ [0xa] = { 0, (unsigned char[]){ 0x5a, 0x2f, 0xc3, 0xa6, 0xd5, 0xfb, 0xcf, 0xcc, 0x85, 0xf2, 0x2f, 0xea, 0x16, 0xeb, 0xbf, 0xcf, 0x9e, 0x52 } }, // NSBlock
+ [0x83] = { 0, (unsigned char[]){ 0xae, 0xc5, 0x56, 0x5, 0xce, 0xb3, 0xd5, 0x18, 0xe9, 0x30, 0xb7, 0x70, 0xf4, 0x78, 0xc9, 0xaf, 0xdd, 0x54 } }, // NSISNonNegativeVariableToBeMinimized
+ }},
+ [0x7] = { 1, (struct _NativeZWRTableEntry[256]) { // 1
+ [0xf] = { 0, (unsigned char[]){ 0x52, 0xec, 0xf7, 0xb1, 0xe5, 0x2a, 0x7c, 0x39, 0xd4, 0x61, 0x17, 0x76, 0x26, 0x8e, 0x7a, 0x5c, 0x8f, 0xb2 } }, // NSISObjectiveVariable
+ [0x40] = { 0, (unsigned char[]){ 0x46, 0xca, 0xad, 0x6d, 0xcc, 0x49, 0x26, 0x3c, 0x81, 0xb8, 0xb, 0xe7, 0x21, 0xcc, 0x28, 0xcf, 0xc3, 0x24 } }, // NSATSGlyphStorage
+ }},
+ [0x8] = { 0, (unsigned char[]){ 0x82, 0x50, 0x66, 0x55, 0x76, 0x98, 0xb5, 0xb8, 0x56, 0x20, 0xd6, 0x1c, 0x7, 0x55, 0x4e, 0x32, 0xe0, 0xb1, 0x33 } }, // NSViewHierarchyLock
+ [0x9] = { 0, (unsigned char[]){ 0x11, 0x7b, 0x21, 0x90, 0x28, 0xc0, 0x39, 0x90, 0x9b, 0xc5, 0xa9, 0xf, 0xaf, 0x8, 0x43, 0x9e, 0xb9, 0x9d, 0xc3 } }, // NSTableOptions
+ [0xf] = { 0, (unsigned char[]){ 0x7d, 0x56, 0x74, 0xad, 0x93, 0x48, 0xe2, 0xbd, 0x2b, 0x5c, 0xb4, 0xf6, 0xf8, 0xd2, 0xfc, 0x47, 0xc0, 0xf4, 0xb9 } }, // _NSQuickLookWrapperDocumentWindow
+ [0x11] = { 0, (unsigned char[]){ 0xa3, 0x61, 0xe2, 0x7d, 0xb1, 0x3e, 0xe4, 0xe1, 0xd1, 0x7a, 0xd, 0xc4, 0x74, 0x52, 0x76, 0xb0, 0xb5, 0x7e, 0xb3 } }, // _NSScalarObjectID
+ [0x1a] = { 1, (struct _NativeZWRTableEntry[256]) { // 1
+ [0x44] = { 0, (unsigned char[]){ 0x3b, 0x91, 0x94, 0xd2, 0x34, 0x5e, 0x4a, 0x18, 0xd9, 0x71, 0x17, 0x2c, 0xc4, 0xfa, 0x5a, 0x71, 0x4c, 0xb5 } }, // NSCorrectionSubPanel
+ [0xda] = { 0, (unsigned char[]){ 0x11, 0x4, 0xac, 0x59, 0xce, 0x58, 0x99, 0x8, 0x5, 0xae, 0xc7, 0x9f, 0x5f, 0x7c, 0x1e, 0xab, 0xf3, 0x12 } }, // NSISNonNegativeVariableWithDelegate
+ }},
+ [0x1c] = { 0, (unsigned char[]){ 0x90, 0xdf, 0xd3, 0x6e, 0xb0, 0x87, 0xd6, 0xc4, 0xa4, 0x33, 0xd9, 0x9f, 0xf9, 0xde, 0x69, 0xf4, 0x80, 0x7d, 0xf4 } }, // NSCorrectionPanel
+ [0x1d] = { 0, (unsigned char[]){ 0xfc, 0x3e, 0x70, 0x29, 0x9a, 0x6f, 0xbe, 0x9a, 0x3e, 0xe7, 0x56, 0x1e, 0x64, 0x13, 0xe9, 0x6a, 0xfd, 0xc9, 0xcd } }, // __NSSharedFontInstanceInfo
+ [0x1f] = { 1, (struct _NativeZWRTableEntry[256]) { // 1
+ [0x3a] = { 0, (unsigned char[]){ 0x80, 0xbb, 0xa7, 0xc1, 0x41, 0xc9, 0xa5, 0x87, 0x46, 0x6c, 0xe8, 0x53, 0xf, 0x31, 0x2c, 0xe4, 0x82, 0xed } }, // NSToolbarConfigPanel
+ [0xf5] = { 0, (unsigned char[]){ 0x26, 0xc2, 0x40, 0xf7, 0x91, 0x16, 0x9f, 0x23, 0x4e, 0x23, 0xa4, 0xfd, 0xcf, 0xe0, 0xb7, 0x12, 0xbe, 0x5 } }, // _NSBrowserTableColumnViewController
+ }},
+ [0x20] = { 0, (unsigned char[]){ 0x45, 0xd6, 0x66, 0x4e, 0xd3, 0x46, 0xa2, 0x31, 0xbc, 0xd4, 0x91, 0xbb, 0xc6, 0x7f, 0xaf, 0x9a, 0x16, 0xf3, 0x55 } }, // NSSpellingPanel
+ [0x24] = { 0, (unsigned char[]){ 0x97, 0x38, 0x41, 0x2b, 0xe7, 0x18, 0x67, 0x62, 0x5, 0xdd, 0xdf, 0xc1, 0x57, 0x59, 0x49, 0xc4, 0x16, 0x32, 0x94 } }, // NSISVariableWithDelegate
+ [0x2b] = { 0, (unsigned char[]){ 0x1, 0xdd, 0xee, 0xa6, 0x38, 0xdf, 0x45, 0x52, 0x1, 0xa3, 0x33, 0x18, 0x2a, 0x2e, 0x17, 0x5, 0x96, 0x81, 0x4a } }, // NSManagedObjectID
+ [0x2d] = { 0, (unsigned char[]){ 0xb6, 0x84, 0x6b, 0x6a, 0xe6, 0x48, 0x56, 0xb4, 0xb8, 0xae, 0x9, 0x8f, 0x88, 0xd4, 0x9f, 0x71, 0x8d, 0x2b, 0xf4 } }, // NSSecureTextView
+ [0x33] = { 0, (unsigned char[]){ 0x46, 0x16, 0x4e, 0xe1, 0x47, 0x1a, 0x32, 0x82, 0x6e, 0xae, 0x61, 0xed, 0xf8, 0xe, 0x27, 0xa8, 0x76, 0xda, 0x8 } }, // __NSFontTypefaceInfo
+ [0x35] = { 0, (unsigned char[]){ 0xc2, 0x5e, 0x22, 0xd0, 0x4b, 0x59, 0x4a, 0xfe, 0xc7, 0xb2, 0xc, 0xb5, 0x8d, 0x7, 0x4b, 0xee, 0x4a, 0x35, 0x52 } }, // _NSFullScreenUnbufferedWindow
+ [0x37] = { 1, (struct _NativeZWRTableEntry[256]) { // 1
+ [0x6f] = { 0, (unsigned char[]){ 0x70, 0x43, 0x47, 0x3f, 0x14, 0x9b, 0xf8, 0x1e, 0x57, 0xcb, 0x40, 0xd6, 0x54, 0xd4, 0xd1, 0x6f, 0xc6, 0x5e } }, // _NSSlideAndCrossFadeAnimationProjectionWindow
+ [0x72] = { 0, (unsigned char[]){ 0x9b, 0xcf, 0x5f, 0xcf, 0x88, 0x75, 0x72, 0x8e, 0xf1, 0x6c, 0xe5, 0xc8, 0x62, 0xc5, 0x5f, 0xe2, 0xcd, 0x5c } }, // NSNavNodeSharedServerController
+ }},
+ [0x38] = { 0, (unsigned char[]){ 0x60, 0x5c, 0x3f, 0xa3, 0xb, 0xc3, 0x8d, 0x3e, 0x7, 0x33, 0x1e, 0x54, 0xf3, 0xed, 0x88, 0x29, 0xe, 0xaf, 0xc3 } }, // NSNavFilepathInputController
+ [0x3a] = { 1, (struct _NativeZWRTableEntry[256]) { // 1
+ [0x19] = { 0, (unsigned char[]){ 0x21, 0x87, 0xa7, 0x0, 0x57, 0xb5, 0x54, 0xdf, 0x53, 0x50, 0x57, 0xe7, 0x88, 0xf6, 0x85, 0x3d, 0x5e, 0x73 } }, // _NSBrowserMatrixColumnViewController
+ [0x29] = { 0, (unsigned char[]){ 0x2f, 0x44, 0xd9, 0xeb, 0x81, 0x1e, 0x89, 0x21, 0x38, 0x1a, 0xd1, 0x36, 0xf5, 0x1b, 0xb1, 0xf, 0xe2, 0xa5 } }, // NSAttributeDictionary
+ }},
+ [0x3d] = { 0, (unsigned char[]){ 0x84, 0x79, 0x16, 0x14, 0xdb, 0x72, 0x27, 0x5, 0xb1, 0x2b, 0x8c, 0xed, 0xfb, 0x1f, 0xe6, 0x65, 0x9b, 0xa3, 0x32 } }, // NSISVariable
+ [0x42] = { 0, (unsigned char[]){ 0x6e, 0xba, 0xa0, 0x45, 0x15, 0x86, 0x37, 0x4b, 0x30, 0x48, 0xe, 0x7b, 0xaf, 0xa, 0xd2, 0x75, 0x43, 0x10, 0xfb } }, // NSTableOptionsPanel
+ [0x43] = { 0, (unsigned char[]){ 0xac, 0xfb, 0xb9, 0xaa, 0xde, 0xc7, 0xe3, 0xe0, 0x91, 0x32, 0x60, 0xad, 0xfe, 0xd2, 0x44, 0xfe, 0x75, 0xbc, 0x6b } }, // NSAccessoryWindow
+ [0x44] = { 0, (unsigned char[]){ 0xe4, 0x9e, 0x1b, 0x5, 0xa9, 0x34, 0xa9, 0xd9, 0xc5, 0xa7, 0x5, 0x16, 0x3d, 0x4f, 0x15, 0x41, 0xa8, 0x45, 0x24 } }, // __NSOperationInternal
+ [0x45] = { 0, (unsigned char[]){ 0xb8, 0xcb, 0x9f, 0xea, 0x3a, 0xf2, 0xe3, 0x30, 0x9d, 0x53, 0xc5, 0x36, 0x95, 0x4a, 0x69, 0x55, 0xea, 0x85, 0xee } }, // NSNavSharedServerController
+ [0x48] = { 0, (unsigned char[]){ 0x57, 0x8c, 0x37, 0xc5, 0x34, 0x5, 0x21, 0x89, 0x5c, 0x4b, 0x15, 0x7, 0x9c, 0xb8, 0xff, 0x7b, 0x6e, 0xf1, 0xae } }, // NSWindow
+ [0x4a] = { 1, (struct _NativeZWRTableEntry[256]) { // 1
+ [0xc] = { 0, (unsigned char[]){ 0xcd, 0x9e, 0xea, 0x1e, 0x8a, 0xea, 0xf, 0x0, 0xf3, 0xe7, 0x33, 0xb1, 0x6f, 0x5b, 0x42, 0x55, 0x55, 0x45 } }, // NSStringDrawingTextStorage
+ [0x3e] = { 0, (unsigned char[]){ 0xc4, 0xeb, 0x56, 0x8b, 0x5, 0x8a, 0xbb, 0xbe, 0xa0, 0xdb, 0x58, 0xd2, 0x5b, 0x99, 0xef, 0xc, 0x36, 0xc0 } }, // NSDocumentRevisionsTimelineWindow
+ }},
+ [0x4c] = { 0, (unsigned char[]){ 0x96, 0x73, 0x2, 0xb9, 0x44, 0xe3, 0x1f, 0xb, 0xaf, 0xab, 0xba, 0xf0, 0x1c, 0x1c, 0x12, 0x0, 0xb7, 0x86, 0xbf } }, // NSLocalWindowWrappingRemoteWindow
+ [0x4d] = { 0, (unsigned char[]){ 0xb2, 0x61, 0xa9, 0x77, 0x21, 0xee, 0x44, 0x1c, 0x86, 0xdc, 0xcd, 0x68, 0x7c, 0x6f, 0x6d, 0xf2, 0x93, 0xed, 0x1e } }, // NSNavAdvancedSearchController
+ [0x4e] = { 1, (struct _NativeZWRTableEntry[256]) { // 1
+ [0xaa] = { 0, (unsigned char[]){ 0x67, 0xf8, 0xa5, 0xc8, 0x3e, 0x19, 0x3f, 0xc0, 0x9, 0x59, 0x79, 0x51, 0xa0, 0x8e, 0xeb, 0xfb, 0x77, 0x26 } }, // _CTNativeGlyphStorage
+ [0xd7] = { 0, (unsigned char[]){ 0xfc, 0xdd, 0x19, 0x16, 0xed, 0x7e, 0x9e, 0x83, 0x8e, 0x25, 0x5c, 0xa6, 0xe6, 0xe, 0xe1, 0x36, 0xc3, 0xb1 } }, // NSTokenTextView
+ }},
+ [0x50] = { 0, (unsigned char[]){ 0xb2, 0x2e, 0x2a, 0x97, 0xb4, 0x8, 0x61, 0xa9, 0x51, 0x72, 0x20, 0x74, 0xbf, 0x85, 0xe4, 0x54, 0xb3, 0x1a, 0x24 } }, // _NSCoreManagedObjectID
+ [0x52] = { 0, (unsigned char[]){ 0xb4, 0xcf, 0x19, 0x47, 0xb8, 0xd5, 0x65, 0x56, 0x75, 0xc0, 0x46, 0xd4, 0x3c, 0x9a, 0xf2, 0x21, 0x2f, 0xc5, 0xca } }, // _PFManagedObjectReferenceQueue
+ [0x53] = { 0, (unsigned char[]){ 0x4d, 0xe5, 0x8d, 0xa1, 0x40, 0xcb, 0x7a, 0x1a, 0x27, 0xd3, 0x89, 0x24, 0x39, 0xda, 0xd1, 0x46, 0x1c, 0xf0, 0x84 } }, // NSProgressPanel
+ [0x54] = { 1, (struct _NativeZWRTableEntry[256]) { // 1
+ [0x77] = { 0, (unsigned char[]){ 0x65, 0xbb, 0x28, 0x9e, 0xbd, 0x9f, 0x5d, 0xc, 0x39, 0x70, 0x5b, 0xe7, 0x65, 0xcc, 0x3c, 0xcc, 0x4a, 0x6 } }, // NSMessagePort
+ [0xa4] = { 0, (unsigned char[]){ 0x4f, 0x92, 0x89, 0xe2, 0x3b, 0x49, 0x6e, 0x70, 0xe1, 0x75, 0x90, 0x79, 0xbb, 0x53, 0x5f, 0x4f, 0xcc, 0x3e } }, // NSColorPopoverController
+ }},
+ [0x59] = { 0, (unsigned char[]){ 0xed, 0xef, 0x25, 0x8c, 0xc5, 0x35, 0xe7, 0xa3, 0xa7, 0x5a, 0xcc, 0xd3, 0x75, 0x8, 0x43, 0xb2, 0xa, 0xee, 0xb2 } }, // NSPort
+ [0x5b] = { 0, (unsigned char[]){ 0x8a, 0x1d, 0xa9, 0x7e, 0x72, 0x5d, 0x70, 0x81, 0xcf, 0xc, 0xe0, 0xb8, 0x73, 0x8f, 0x5c, 0x85, 0xd6, 0xa1, 0xe1 } }, // _NSBrowserPreviewColumnViewController
+ [0x5f] = { 1, (struct _NativeZWRTableEntry[256]) { // 1
+ [0x22] = { 0, (unsigned char[]){ 0x72, 0x59, 0x13, 0xf8, 0x71, 0xdb, 0x3a, 0xbe, 0xa0, 0x1b, 0xaf, 0xed, 0x76, 0xb, 0x9a, 0xf3, 0x5e, 0xd8 } }, // NSBasicObjectID
+ [0xc0] = { 0, (unsigned char[]){ 0x5e, 0x88, 0x3a, 0xb1, 0x91, 0x9c, 0xf9, 0x9d, 0x19, 0xfe, 0x79, 0xa9, 0x8f, 0x7a, 0x42, 0x3, 0x7c, 0x72 } }, // _NSSavePanelTextView
+ }},
+ [0x67] = { 0, (unsigned char[]){ 0xae, 0xaf, 0x59, 0x8c, 0xa3, 0x4a, 0xf8, 0xe9, 0xa, 0xe8, 0x7c, 0x18, 0x48, 0x0, 0x34, 0xbc, 0x4a, 0x69, 0x40 } }, // NSRulerMarkerPanel
+ [0x68] = { 0, (unsigned char[]){ 0x3a, 0x65, 0xf1, 0xba, 0x6a, 0x7f, 0xa7, 0xfb, 0x12, 0xe4, 0x1f, 0x53, 0x25, 0xad, 0x74, 0x88, 0xd, 0x73, 0x30 } }, // NSStatusBarWindow
+ [0x69] = { 0, (unsigned char[]){ 0x20, 0xef, 0xa7, 0x58, 0xa2, 0x8c, 0xc3, 0x20, 0xa1, 0xb8, 0xcd, 0x75, 0x46, 0x40, 0xfc, 0x5, 0xae, 0x61, 0xa } }, // NSToolbarFullScreenWindow
+ [0x6a] = { 1, (struct _NativeZWRTableEntry[256]) { // 1
+ [0x16] = { 0, (unsigned char[]){ 0xaf, 0x44, 0x1, 0x18, 0x5e, 0x88, 0x4d, 0x10, 0x1c, 0x26, 0x2b, 0xf7, 0xca, 0xf4, 0x9, 0xb, 0x24, 0x8e } }, // NSCarbonWindow
+ [0x72] = { 0, (unsigned char[]){ 0x94, 0xde, 0xb9, 0xc4, 0x93, 0x86, 0xcc, 0x88, 0x1e, 0x3, 0x8b, 0x7f, 0x72, 0x7c, 0x51, 0x96, 0xfb, 0xba } }, // NSPrintPreviewController
+ }},
+ [0x6e] = { 0, (unsigned char[]){ 0x7, 0x4a, 0x8f, 0xd5, 0xad, 0xa6, 0xbf, 0x62, 0x15, 0x49, 0x9a, 0x98, 0xfb, 0x9e, 0x6c, 0x9a, 0x29, 0x5e, 0x45 } }, // NSTextView
+ [0x6f] = { 1, (struct _NativeZWRTableEntry[256]) { // 1
+ [0x34] = { 0, (unsigned char[]){ 0x15, 0x3d, 0x33, 0x27, 0xe2, 0x98, 0x15, 0x6b, 0xd, 0xc5, 0xb0, 0x9, 0x8e, 0x8b, 0x22, 0x40, 0x88, 0x9c } }, // __NSATSStringSegment
+ [0xc5] = { 0, (unsigned char[]){ 0x6c, 0x2c, 0x2c, 0x37, 0xe2, 0x89, 0x72, 0x56, 0xb3, 0x7d, 0xb6, 0x2d, 0x67, 0x4c, 0xd0, 0x5f, 0x55, 0xc1 } }, // NSSubTextStorage
+ }},
+ [0x72] = { 0, (unsigned char[]){ 0x8d, 0x27, 0x74, 0x97, 0x62, 0x6, 0x8b, 0x6b, 0xec, 0x92, 0x51, 0x4a, 0xbd, 0x43, 0xc8, 0xaa, 0x6c, 0x58, 0x9 } }, // NSTextViewCompletionWindow
+ [0x73] = { 0, (unsigned char[]){ 0xb1, 0xc6, 0x4b, 0x54, 0xb0, 0x56, 0x42, 0x26, 0xd0, 0xc, 0xf4, 0x28, 0x23, 0x12, 0x37, 0xad, 0xb4, 0x7d, 0xac } }, // _NSFullScreenTransitionOverlayWindow
+ [0x75] = { 0, (unsigned char[]){ 0x4b, 0xe3, 0x5c, 0xb0, 0x20, 0x14, 0xca, 0x8c, 0x61, 0x60, 0xdc, 0x7a, 0xee, 0xf, 0x88, 0x19, 0x9f, 0xa7, 0x68 } }, // _PFTask
+ [0x76] = { 0, (unsigned char[]){ 0xf5, 0x2d, 0xe3, 0x23, 0x10, 0x98, 0x61, 0xac, 0x59, 0x99, 0x59, 0xda, 0x3d, 0x8d, 0xa6, 0xa, 0x67, 0x37, 0xc0 } }, // NSParagraphStyle
+ [0x77] = { 0, (unsigned char[]){ 0xe0, 0xd5, 0x7, 0x83, 0xa7, 0x2e, 0x7e, 0xba, 0xac, 0x6a, 0xaa, 0x97, 0x47, 0x4f, 0xb4, 0x26, 0xe8, 0xd5, 0xca } }, // _NSOrderOutAnimationProxyWindow
+ [0x7c] = { 0, (unsigned char[]){ 0xdd, 0x75, 0x76, 0xb0, 0xb1, 0xfc, 0xcb, 0x3e, 0xd7, 0x51, 0xe3, 0xf4, 0x93, 0x78, 0xd5, 0x27, 0xc2, 0x4c, 0xc4 } }, // NSPrintPanelOldAccessoryController
+ [0x7d] = { 0, (unsigned char[]){ 0x76, 0x18, 0xf6, 0x67, 0x49, 0xf0, 0x27, 0xd0, 0x31, 0x14, 0xf3, 0xce, 0x4d, 0x6e, 0x95, 0x26, 0x95, 0xa1, 0xb9 } }, // NSNavProgressStatusViewController
+ [0x7f] = { 1, (struct _NativeZWRTableEntry[256]) { // 1
+ [0x18] = { 0, (unsigned char[]){ 0x3a, 0xe7, 0x3a, 0x47, 0xa1, 0x86, 0x5c, 0x8b, 0x3d, 0xad, 0x74, 0xe7, 0x7b, 0xa3, 0x71, 0xce, 0xb6, 0xed } }, // NSWindowController
+ [0xb5] = { 0, (unsigned char[]){ 0x68, 0x7e, 0xc6, 0xa1, 0xb8, 0x14, 0xb3, 0x1b, 0xd2, 0xec, 0xce, 0x99, 0x3e, 0x3, 0x72, 0x1d, 0x17, 0xce } }, // NSTextTab
+ }},
+ [0x83] = { 0, (unsigned char[]){ 0x11, 0x3f, 0x29, 0x8e, 0x75, 0xfa, 0x19, 0xca, 0x82, 0x5f, 0xc, 0xe6, 0x40, 0x60, 0x99, 0xa5, 0xcc, 0xb0, 0xd5 } }, // _NSFullScreenWindow
+ [0x84] = { 0, (unsigned char[]){ 0x5d, 0x46, 0x99, 0xf2, 0x6f, 0x3e, 0x70, 0xd0, 0x7, 0x4, 0x32, 0x68, 0x82, 0x5d, 0xad, 0xdb, 0x5d, 0x96, 0x89 } }, // NSISNonNegativeMarkerVariable
+ [0x89] = { 0, (unsigned char[]){ 0xe8, 0x30, 0xee, 0xf9, 0x87, 0x23, 0xd7, 0x55, 0x41, 0x71, 0xfe, 0xbd, 0x6a, 0x6a, 0x9, 0xf8, 0xa8, 0xa9, 0xb0 } }, // NSCarbonMenuWindow
+ [0x8e] = { 0, (unsigned char[]){ 0x3c, 0x39, 0xef, 0xfb, 0x5e, 0xbf, 0xfc, 0x69, 0x9f, 0xdb, 0xd7, 0x4c, 0x97, 0xaf, 0x9f, 0xc7, 0xbf, 0xe7, 0x5 } }, // __NSFinalizingBlock
+ [0x91] = { 0, (unsigned char[]){ 0x29, 0xe6, 0xff, 0x9c, 0xa8, 0x1b, 0x78, 0x33, 0x5e, 0xf5, 0xd6, 0xf6, 0xf3, 0x34, 0xa9, 0x27, 0x68, 0xdc, 0x48 } }, // NSISNonNegativeVariableWithDelegateToBeMinimized
+ [0x93] = { 0, (unsigned char[]){ 0x6b, 0x15, 0xf9, 0xf2, 0xb9, 0xfb, 0x86, 0x42, 0xb2, 0x9d, 0x76, 0xaa, 0x9a, 0x3e, 0xaf, 0x47, 0x3b, 0x4b, 0x97 } }, // _NSDuplicateDocumentAnimationProjectionWindow
+ [0x95] = { 1, (struct _NativeZWRTableEntry[256]) { // 1
+ [0x1f] = { 0, (unsigned char[]){ 0xc2, 0x2d, 0x6b, 0x81, 0x8b, 0xc6, 0x6d, 0x62, 0x89, 0x92, 0x68, 0x5f, 0x4b, 0x54, 0x74, 0xbc, 0x1b, 0x43 } }, // NSExceptionAlertController
+ [0xca] = { 0, (unsigned char[]){ 0x6b, 0x18, 0xe4, 0xc5, 0xf8, 0x35, 0xae, 0x2c, 0xc1, 0x2c, 0xdc, 0xcd, 0xec, 0x4e, 0xca, 0x76, 0x94, 0x6 } }, // NSColorSpace
+ }},
+ [0x96] = { 0, (unsigned char[]){ 0x9f, 0x99, 0xf9, 0x49, 0x2a, 0xc, 0xfe, 0x8, 0x4e, 0xed, 0xd4, 0x2b, 0x69, 0x39, 0xef, 0x12, 0xba, 0x18, 0x2 } }, // NSToolTipPanel
+ [0x97] = { 0, (unsigned char[]){ 0x20, 0x8, 0xb2, 0x87, 0x77, 0xe3, 0xa4, 0x7e, 0xbe, 0x34, 0x6f, 0x84, 0x29, 0xa6, 0x21, 0x2a, 0x7f, 0xcc, 0xe } }, // __NSAutoBlock
+ [0x98] = { 1, (struct _NativeZWRTableEntry[256]) { // 1
+ [0x4a] = { 0, (unsigned char[]){ 0xd, 0xf9, 0x7b, 0xf8, 0x20, 0x1c, 0xc6, 0x40, 0x43, 0x6, 0x7, 0x6c, 0x14, 0xd7, 0x25, 0x21, 0x25, 0xb7 } }, // NSSingleLineTypesetter
+ [0xb2] = { 0, (unsigned char[]){ 0xb6, 0xb4, 0x58, 0x5d, 0x2a, 0x3c, 0xc, 0xc8, 0x27, 0xe7, 0x6e, 0x63, 0x7, 0x7e, 0x53, 0xb2, 0x50, 0x59 } }, // NSCollectionViewItem
+ [0xdf] = { 0, (unsigned char[]){ 0xf3, 0x3a, 0x92, 0xb7, 0x1a, 0x77, 0x8f, 0xf7, 0x45, 0x92, 0xd0, 0x22, 0x18, 0xb0, 0xcc, 0xc5, 0x4f, 0x96 } }, // NSScalarObjectID64
+ }},
+ [0x9a] = { 0, (unsigned char[]){ 0x57, 0xa6, 0xe7, 0x54, 0xa2, 0xbc, 0xe6, 0x20, 0x28, 0x42, 0x60, 0x93, 0x3, 0x14, 0x9d, 0xdf, 0xdb, 0xda, 0x4f } }, // NSSidebarImage
+ [0x9d] = { 0, (unsigned char[]){ 0xb3, 0x81, 0xc4, 0xce, 0x4b, 0x48, 0x6d, 0x80, 0x6a, 0xf4, 0xe1, 0x31, 0xda, 0x8d, 0xc7, 0x83, 0xab, 0xc5, 0xa1 } }, // NSPanel
+ [0xa0] = { 0, (unsigned char[]){ 0x63, 0xb, 0xc2, 0xb6, 0xbe, 0xf6, 0xc3, 0x86, 0x47, 0x7, 0xe, 0xd8, 0xef, 0xff, 0x92, 0xe5, 0x31, 0xe9, 0x0 } }, // NSComboBoxWindow
+ [0xa2] = { 0, (unsigned char[]){ 0x83, 0x8d, 0xd0, 0xff, 0xa3, 0x36, 0x89, 0xef, 0x62, 0xbc, 0xb5, 0xd6, 0xbb, 0x7a, 0x4b, 0xf6, 0xf6, 0xb1, 0xfb } }, // NSViewController
+ [0xa6] = { 0, (unsigned char[]){ 0xe8, 0x41, 0xe7, 0xac, 0x58, 0xf6, 0x21, 0x64, 0x82, 0xad, 0xa8, 0x65, 0x1a, 0x54, 0x58, 0x8c, 0xd3, 0x54, 0xa0 } }, // _NSNonretainedFullScreenWindow
+ [0xa9] = { 0, (unsigned char[]){ 0x2f, 0xd9, 0xc0, 0xea, 0xae, 0x7d, 0x3, 0xd8, 0x5e, 0xbe, 0x67, 0xee, 0x5f, 0xb0, 0x60, 0xd0, 0x57, 0x7a, 0x5c } }, // _NSAutomaticFocusRingOverlayWindow
+ [0xaa] = { 0, (unsigned char[]){ 0x9b, 0x75, 0x33, 0xf, 0xa8, 0xfa, 0xda, 0x8d, 0x4a, 0xd6, 0x4c, 0x43, 0x12, 0x47, 0x4d, 0x10, 0xb2, 0xc0, 0xa0 } }, // NSNavProgressWindowController
+ [0xab] = { 0, (unsigned char[]){ 0xed, 0xd5, 0xe6, 0xe8, 0xac, 0x1, 0xd, 0x20, 0x57, 0x7f, 0x71, 0xfd, 0x18, 0xcc, 0x69, 0x72, 0xa, 0x1d, 0x42 } }, // _NSCachedAttributedString
+ [0xac] = { 0, (unsigned char[]){ 0x62, 0xbc, 0xb9, 0x26, 0xdd, 0x24, 0x3d, 0x3f, 0xc4, 0x26, 0x47, 0x50, 0xc6, 0xbb, 0x6b, 0x56, 0x93, 0x16, 0x2c } }, // NSLineFragmentRenderingContext
+ [0xad] = { 0, (unsigned char[]){ 0x75, 0xf9, 0xaa, 0x1b, 0xf9, 0x53, 0x93, 0x35, 0xe3, 0x16, 0x98, 0xfc, 0x7e, 0xe5, 0xec, 0x9b, 0xca, 0x64, 0xef } }, // NSFindPatternFieldEditor
+ [0xae] = { 0, (unsigned char[]){ 0xd, 0x3, 0x25, 0x76, 0x1f, 0x1f, 0x45, 0x58, 0x25, 0xb8, 0x8f, 0xa8, 0x37, 0x72, 0xfd, 0xf5, 0xb7, 0xf1, 0x85 } }, // PBOXMenuWindow
+ [0xb0] = { 0, (unsigned char[]){ 0x40, 0x9, 0xa1, 0xd9, 0xb4, 0xf, 0x4, 0xb6, 0x4, 0xd6, 0xd5, 0x7b, 0x9d, 0xdf, 0x9e, 0x8, 0xa2, 0xe4, 0xb7 } }, // NSMachPort
+ [0xb1] = { 0, (unsigned char[]){ 0x7e, 0x84, 0xd, 0x23, 0x8f, 0x79, 0x56, 0xff, 0x92, 0x40, 0x76, 0xb0, 0x6b, 0x81, 0x76, 0x96, 0xf, 0xc1, 0xa } }, // __NSAutoBlock__
+ [0xb4] = { 0, (unsigned char[]){ 0x69, 0x23, 0xfd, 0xe9, 0xf, 0x24, 0x19, 0xb7, 0xa7, 0x92, 0xe1, 0xed, 0x1b, 0xd1, 0xa0, 0xae, 0x64, 0x85, 0x87 } }, // NSExternalRefCountedData
+ [0xbc] = { 0, (unsigned char[]){ 0x7b, 0x3e, 0x3c, 0xe7, 0xe3, 0x14, 0x1b, 0x46, 0x77, 0x44, 0xdb, 0x43, 0xc3, 0xa4, 0xb9, 0x31, 0x66, 0x8, 0xc7 } }, // _NSFlippedImage
+ [0xbe] = { 1, (struct _NativeZWRTableEntry[256]) { // 1
+ [0x66] = { 0, (unsigned char[]){ 0x1a, 0x9f, 0x99, 0xf3, 0x4a, 0xb9, 0xa7, 0xb0, 0x6, 0xad, 0xc1, 0x81, 0xdf, 0xe2, 0x1e, 0x1, 0x8b, 0xf4 } }, // _NSBorderlessLayerTreeProjectionWindow
+ [0xab] = { 0, (unsigned char[]){ 0x49, 0x7d, 0x5f, 0x63, 0xfe, 0xdc, 0xa7, 0x43, 0x43, 0xad, 0x24, 0x80, 0x6c, 0xeb, 0x36, 0x4, 0xd2, 0x9b } }, // NSFontPanel
+ }},
+ [0xbf] = { 0, (unsigned char[]){ 0x83, 0x4b, 0x26, 0xf2, 0xc3, 0x24, 0xc5, 0x64, 0x5d, 0x4c, 0x96, 0x86, 0xed, 0x42, 0x1c, 0x83, 0x5, 0x34, 0x8c } }, // NSNavProgressErrorViewController
+ [0xc1] = { 0, (unsigned char[]){ 0x94, 0xb4, 0x7c, 0xba, 0xa4, 0xf5, 0x3a, 0x43, 0x6, 0xa3, 0x84, 0x64, 0xeb, 0xf7, 0xe0, 0xe0, 0xb6, 0x98, 0x55 } }, // NSText
+ [0xc3] = { 0, (unsigned char[]){ 0x2e, 0x12, 0x59, 0xba, 0x72, 0xd7, 0x51, 0x40, 0x73, 0xe3, 0xe1, 0xfb, 0x1e, 0x97, 0xb0, 0xc5, 0xc1, 0xe4, 0xeb } }, // _NSTextFinderOverlayWindow
+ [0xcd] = { 1, (struct _NativeZWRTableEntry[256]) { // 1
+ [0x1b] = { 0, (unsigned char[]){ 0x3b, 0x80, 0x3f, 0x14, 0x9c, 0xde, 0xad, 0x18, 0x4b, 0xe9, 0x44, 0xba, 0x1, 0x5f, 0x8, 0x98, 0xd6, 0x8c } }, // __NSStackBlock
+ [0x81] = { 0, (unsigned char[]){ 0xa9, 0x68, 0x44, 0x6c, 0xfc, 0x5b, 0x40, 0xfe, 0x10, 0xb4, 0xc3, 0x4e, 0x19, 0xfd, 0x57, 0x68, 0x6c, 0xcb } }, // NSFindPanel
+ }},
+ [0xd2] = { 0, (unsigned char[]){ 0x53, 0x40, 0xb2, 0xe9, 0xe7, 0xd8, 0xaa, 0xa9, 0x8c, 0x59, 0x99, 0x1, 0x9, 0x2b, 0xa9, 0x5a, 0x8c, 0x4, 0xa4 } }, // NSDocumentRevisionsWindow
+ [0xd9] = { 0, (unsigned char[]){ 0x9, 0x12, 0x39, 0x4d, 0xa4, 0x3, 0x8b, 0x2, 0x13, 0x4a, 0xc6, 0x58, 0xd5, 0x9e, 0x50, 0x4a, 0xf0, 0x2, 0x36 } }, // NSISNonNegativeVariable
+ [0xdb] = { 0, (unsigned char[]){ 0x1a, 0x27, 0xe4, 0x7, 0x22, 0xf5, 0x27, 0xc3, 0xcd, 0xc8, 0x2b, 0xb6, 0x2c, 0x25, 0x40, 0xf9, 0x46, 0xa4, 0x73 } }, // NSFont
+ [0xdc] = { 1, (struct _NativeZWRTableEntry[256]) { // 1
+ [0x6] = { 0, (unsigned char[]){ 0x59, 0x16, 0xd4, 0x5a, 0xea, 0x6f, 0x8e, 0x8, 0xac, 0x89, 0xac, 0xb, 0x73, 0x2c, 0x62, 0x67, 0xff, 0x0 } }, // __NSFinalizingBlock__
+ [0x10] = { 0, (unsigned char[]){ 0xab, 0x59, 0x12, 0x43, 0x64, 0x12, 0x79, 0xe0, 0x82, 0xb3, 0xf9, 0xcd, 0x3b, 0xf4, 0x4d, 0x7b, 0x94, 0x25 } }, // NSPersistentUIEncodedReference
+ }},
+ [0xdd] = { 1, (struct _NativeZWRTableEntry[256]) { // 1
+ [0x94] = { 0, (unsigned char[]){ 0x9b, 0xe, 0x2a, 0x0, 0x1b, 0x77, 0x4d, 0x1c, 0xe6, 0x22, 0x91, 0x1d, 0x0, 0xc4, 0xf2, 0x51, 0xaa, 0x77 } }, // NSFontManager
+ [0x97] = { 0, (unsigned char[]){ 0x91, 0x5, 0x67, 0xd4, 0xed, 0x70, 0xac, 0xca, 0x54, 0x91, 0x52, 0x9a, 0x83, 0x97, 0xd2, 0x27, 0x32, 0x45 } }, // NSDockMiniViewWindow
+ }},
+ [0xde] = { 1, (struct _NativeZWRTableEntry[256]) { // 1
+ [0x5d] = { 0, (unsigned char[]){ 0x3d, 0x4e, 0xd6, 0x7a, 0x5c, 0x6b, 0xe7, 0x4a, 0x4c, 0xa, 0xbf, 0xbe, 0x5f, 0xdf, 0x48, 0x34, 0x80, 0xe8 } }, // NSBrowserColumnViewController
+ [0x96] = { 0, (unsigned char[]){ 0xa9, 0x1e, 0x9e, 0x35, 0x8f, 0x86, 0x47, 0x74, 0xd3, 0x6b, 0x36, 0x41, 0x53, 0x70, 0x40, 0x52, 0xaf, 0xcb } }, // __NSStackBlock__
+ }},
+ [0xe1] = { 0, (unsigned char[]){ 0xbf, 0xae, 0xbb, 0x5e, 0xb3, 0x4f, 0xa1, 0xe6, 0x4e, 0xb0, 0xd7, 0x78, 0x96, 0xba, 0x99, 0x51, 0xc6, 0x14, 0xbe } }, // NSNavPreviewController
+ [0xe5] = { 0, (unsigned char[]){ 0xf0, 0x45, 0x53, 0x1a, 0xc8, 0x5d, 0x6b, 0xec, 0x33, 0x26, 0xf6, 0x40, 0xbe, 0x49, 0x18, 0xab, 0xd1, 0x1d, 0xa8 } }, // NSPersistentUIWindowInfo
+ [0xe6] = { 0, (unsigned char[]){ 0x4f, 0x4f, 0xa8, 0x1f, 0x86, 0x21, 0x2b, 0x2c, 0xea, 0xab, 0xc4, 0xd5, 0x21, 0x66, 0x4c, 0xd8, 0x5b, 0xa0, 0x93 } }, // NSTypeSelectPanel
+ [0xe8] = { 1, (struct _NativeZWRTableEntry[256]) { // 1
+ [0x58] = { 0, (unsigned char[]){ 0xc1, 0x9e, 0x22, 0x8f, 0x43, 0x27, 0xfc, 0xe4, 0x97, 0xfb, 0x26, 0xeb, 0x32, 0x7b, 0xaf, 0x83, 0xc1, 0x89 } }, // _NSMagnifierWindow
+ [0x8c] = { 0, (unsigned char[]){ 0x19, 0x95, 0x99, 0x16, 0xe0, 0x53, 0x7, 0xfd, 0xe0, 0xde, 0x1c, 0x45, 0x44, 0x2f, 0xa3, 0xaf, 0xee, 0x90 } }, // NSScalarObjectID48
+ }},
+ [0xe9] = { 0, (unsigned char[]){ 0xc6, 0x97, 0x40, 0x80, 0x2e, 0xc7, 0xd2, 0xbd, 0xc9, 0xd9, 0x7b, 0x21, 0x74, 0x23, 0x43, 0xf, 0xe1, 0x5a, 0x71 } }, // NSNavNodePreviewController
+ [0xea] = { 0, (unsigned char[]){ 0x2f, 0x9f, 0x2c, 0xbf, 0x6b, 0xa7, 0x23, 0x7e, 0x64, 0x70, 0xcc, 0x75, 0x9c, 0xa9, 0xbd, 0x70, 0x2c, 0xd1, 0x66 } }, // NSATSTypesetter
+ [0xec] = { 0, (unsigned char[]){ 0xd0, 0xc9, 0x57, 0xaf, 0xce, 0xfe, 0x15, 0xe7, 0xa3, 0xab, 0x2c, 0xda, 0x72, 0xae, 0xad, 0x17, 0x45, 0x86, 0xb1 } }, // _NSPopoverWindow
+ [0xf1] = { 1, (struct _NativeZWRTableEntry[256]) { // 1
+ [0xa5] = { 0, (unsigned char[]){ 0x56, 0x9f, 0x8e, 0xfd, 0x1c, 0xc1, 0x5a, 0x15, 0xc5, 0x2, 0xd, 0x56, 0xb4, 0x1b, 0x70, 0x10, 0xdf, 0xa } }, // NSSavePanel
+ [0xf5] = { 0, (unsigned char[]){ 0xf3, 0x38, 0xe1, 0x77, 0x44, 0x43, 0x88, 0x4, 0x36, 0x2, 0x38, 0xfc, 0xfc, 0xfb, 0xa8, 0x17, 0x4c, 0xe } }, // _NSToolbarDefaultImageRepWindow
+ }},
+ [0xf2] = { 0, (unsigned char[]){ 0xce, 0x71, 0x3f, 0x21, 0x3, 0x1b, 0x57, 0x65, 0x33, 0xbf, 0xe7, 0x23, 0x4d, 0x99, 0x82, 0x1b, 0xb9, 0xf6, 0x34 } }, // NSISPureMarkerVariable
+ [0xf3] = { 1, (struct _NativeZWRTableEntry[256]) { // 1
+ [0x66] = { 0, (unsigned char[]){ 0x95, 0xb6, 0xa7, 0x27, 0x66, 0x70, 0x2f, 0xc5, 0x4a, 0x38, 0xe6, 0x3b, 0x34, 0xd, 0x54, 0x21, 0x87, 0x8e } }, // NSTempAttributeDictionary
+ [0xb8] = { 0, (unsigned char[]){ 0x8a, 0xcf, 0x23, 0xe6, 0x69, 0xe8, 0x76, 0x42, 0x9d, 0xb1, 0x4a, 0x2, 0xb1, 0x9f, 0x84, 0xa4, 0x39, 0x3e } }, // NSISNonNegativeMarkerVariableToBeMinimized
+ [0xeb] = { 0, (unsigned char[]){ 0x5a, 0x8e, 0x70, 0xf6, 0xbf, 0x41, 0x37, 0x89, 0x2e, 0x94, 0x4b, 0x94, 0x23, 0x7d, 0x34, 0x6c, 0x46, 0xb4 } }, // NSOpenPanel
+ }},
+ [0xf7] = { 0, (unsigned char[]){ 0xcc, 0x3b, 0x53, 0x10, 0x6b, 0x29, 0xa6, 0x2c, 0xbd, 0xb4, 0x33, 0x8f, 0xa2, 0x46, 0x50, 0x9f, 0x97, 0xe6, 0x77 } }, // NSImage
+ [0xf9] = { 0, (unsigned char[]){ 0x89, 0x82, 0x91, 0xa7, 0xfc, 0x43, 0xee, 0x1b, 0x3, 0xef, 0xcc, 0x48, 0x8, 0x11, 0x51, 0x9b, 0x72, 0xe9, 0x14 } }, // NSNavNewFolderController
+ [0xfa] = { 0, (unsigned char[]){ 0x2c, 0xb3, 0xa5, 0x1a, 0xe1, 0xa0, 0x3, 0x94, 0x42, 0xe2, 0x6c, 0xaa, 0xa1, 0xf8, 0x23, 0xb2, 0x12, 0x8e, 0xfd } }, // NSMutableParagraphStyle
+ [0xfc] = { 1, (struct _NativeZWRTableEntry[256]) { // 1
+ [0xd4] = { 0, (unsigned char[]){ 0x7f, 0xea, 0x1b, 0x11, 0xbf, 0xeb, 0x92, 0x57, 0x23, 0x70, 0x9, 0x12, 0x89, 0xaf, 0x84, 0xa2, 0xdf, 0x31 } }, // NSNavProgressWindow
+ [0xd8] = { 0, (unsigned char[]){ 0x12, 0x31, 0x5f, 0x60, 0x61, 0x94, 0x7b, 0x74, 0xde, 0xd5, 0xf9, 0x34, 0x6a, 0x51, 0xff, 0x16, 0xef, 0x1e } }, // NSDrawerWindow
+ }},
+ [0xff] = { 0, (unsigned char[]){ 0xd7, 0x9a, 0x4b, 0x94, 0x11, 0xb7, 0xbb, 0xb8, 0x25, 0x4d, 0x34, 0x60, 0x80, 0x46, 0xdc, 0x3a, 0x95, 0xed, 0xe3 } }, // NSLazyBrowserCell
+};
diff --git a/Source/NSTimer+MAWeakTimer.h b/Source/NSTimer+MAWeakTimer.h
new file mode 100644
index 0000000..a4b7d37
--- /dev/null
+++ b/Source/NSTimer+MAWeakTimer.h
@@ -0,0 +1,14 @@
+//
+// NSTimer+MAWeakTimer.h
+// ZeroingWeakRef
+//
+// Created by Remy Demarest on 27/10/2011.
+// Copyright (c) 2011 NuLayer Inc. All rights reserved.
+//
+
+#import
+
+@interface NSTimer (MAWeakTimer)
++ (NSTimer *)scheduledWeakTimerWithTimeInterval:(NSTimeInterval)seconds target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats;
++ (NSTimer *)weakTimerWithTimeInterval:(NSTimeInterval)seconds target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats;
+@end
diff --git a/Source/NSTimer+MAWeakTimer.m b/Source/NSTimer+MAWeakTimer.m
new file mode 100644
index 0000000..37351ae
--- /dev/null
+++ b/Source/NSTimer+MAWeakTimer.m
@@ -0,0 +1,55 @@
+//
+// NSTimer+MAWeakTimer.m
+// ZeroingWeakRef
+//
+// Created by Remy Demarest on 27/10/2011.
+// Copyright (c) 2011 NuLayer Inc. All rights reserved.
+//
+
+#import "NSTimer+MAWeakTimer.h"
+#import "MAZeroingWeakRef.h"
+#import "MAZeroingWeakProxy.h"
+
+@implementation NSTimer (MAWeakTimer)
+
++ (NSTimer *)scheduledWeakTimerWithTimeInterval:(NSTimeInterval)seconds target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats;
+{
+ // Use a proxy so the message sent by the timer is passed down directly to the target
+ MAZeroingWeakProxy *proxy = [MAZeroingWeakProxy proxyWithTarget:target];
+
+ // The timer releases its target as soon as it is invalidated
+ // thus releasing the proxy object, the proxy object will then release its cleanup block
+ // releasing the cleanup block will end in releasing the timer
+ // which in turn will remove all traces of renegade objects from memory
+ NSTimer *timer = [self scheduledTimerWithTimeInterval:seconds target:proxy selector:aSelector userInfo:userInfo repeats:repeats];
+
+ [proxy setCleanupBlock:
+ ^(id target)
+ {
+ [timer invalidate];
+ }];
+
+ return timer;
+}
+
++ (NSTimer *)weakTimerWithTimeInterval:(NSTimeInterval)seconds target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats;
+{
+ // Use a proxy so the message sent by the timer is passed down directly to the target
+ MAZeroingWeakProxy *proxy = [MAZeroingWeakProxy proxyWithTarget:target];
+
+ // The timer releases its target as soon as it is invalidated
+ // thus releasing the proxy object, the proxy object will then release its cleanup block
+ // releasing the cleanup block will end in releasing the timer
+ // which in turn will remove all traces of renegade objects from memory
+ NSTimer *timer = [self timerWithTimeInterval:seconds target:proxy selector:aSelector userInfo:userInfo repeats:repeats];
+
+ [proxy setCleanupBlock:
+ ^(id target)
+ {
+ [timer invalidate];
+ }];
+
+ return timer;
+}
+
+@end
diff --git a/Source/main.m b/Source/main.m
old mode 100644
new mode 100755
index f9988de..fc3d9f1
--- a/Source/main.m
+++ b/Source/main.m
@@ -367,7 +367,7 @@ static void TestWeakProxy(void)
}
NSMutableString *str = [[NSMutableString alloc] init];
- NSMutableString *proxy = [[MAZeroingWeakProxy alloc] initWithTarget: str];
+ NSMutableString *proxy = (NSMutableString *)[[MAZeroingWeakProxy alloc] initWithTarget: str];
WithPool(^{
TEST_ASSERT([proxy isEqual: @""]);
@@ -492,6 +492,24 @@ static void TestKVOReleaseCrash(void)
[ref release];
}
+static void TestNativeZWRFallback(void)
+{
+ NSPort *port = [NSPort port];
+ [MAZeroingWeakRef refWithTarget: port];
+}
+
+static void TestKVORemovalCrash(void)
+{
+ NSObject *obj = [[NSObject alloc] init];
+ NSObject *observer = [[NSObject alloc] init];
+ [obj addObserver:observer forKeyPath:@"description" options:NSKeyValueObservingOptionNew context:nil];
+ MAZeroingWeakRef *weakRef = [MAZeroingWeakRef refWithTarget:obj];
+ [obj removeObserver:observer forKeyPath:@"description"];
+ [obj release];
+ NSLog(@"weakRef %@", weakRef.target);
+ [observer release];
+}
+
int main(int argc, const char * argv[])
{
WithPool(^{
@@ -515,6 +533,8 @@ int main(int argc, const char * argv[])
TEST(TestClassForCoder);
TEST(TestKVOReleaseNoCrash);
TEST(TestKVOReleaseCrash);
+ TEST(TestNativeZWRFallback);
+ TEST(TestKVORemovalCrash);
NSString *message;
if(gFailureCount)
diff --git a/ZeroingWeakRef.xcodeproj/project.pbxproj b/ZeroingWeakRef.xcodeproj/project.pbxproj
old mode 100644
new mode 100755
index 2243ea1..9e50276
--- a/ZeroingWeakRef.xcodeproj/project.pbxproj
+++ b/ZeroingWeakRef.xcodeproj/project.pbxproj
@@ -8,15 +8,32 @@
/* Begin PBXBuildFile section */
C208C96011EBB8F100A8E38D /* MANotificationCenterAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = C208C95F11EBB8F100A8E38D /* MANotificationCenterAdditions.m */; };
+ C23912C3144A54F900AEFD01 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C23912C2144A54F900AEFD01 /* UIKit.framework */; };
+ C23912C4144A54F900AEFD01 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C2D7540B11E2588600816068 /* Foundation.framework */; };
+ C23912C6144A54F900AEFD01 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C23912C5144A54F900AEFD01 /* CoreGraphics.framework */; };
+ C23912CE144A54F900AEFD01 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C23912CD144A54F900AEFD01 /* main.m */; };
+ C2414C0D144A5F2C0029A0D4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C2D7540B11E2588600816068 /* Foundation.framework */; };
+ C2414C18144A5F690029A0D4 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C23912CD144A54F900AEFD01 /* main.m */; };
+ C2414C1C144A5F8F0029A0D4 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C2414C1B144A5F8F0029A0D4 /* AppKit.framework */; };
C25675F111E25C6A00CAB48E /* MAZeroingWeakRef.m in Sources */ = {isa = PBXBuildFile; fileRef = C25675F011E25C6A00CAB48E /* MAZeroingWeakRef.m */; };
C26F610511F207270080EC96 /* MAZeroingWeakProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = C26F610411F207270080EC96 /* MAZeroingWeakProxy.m */; };
C2D7540C11E2588600816068 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C2D7540B11E2588600816068 /* Foundation.framework */; };
C2D7541011E2588600816068 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C2D7540F11E2588600816068 /* main.m */; };
C2DF1F2611ED2C1300EFC8AE /* MAWeakArray.m in Sources */ = {isa = PBXBuildFile; fileRef = C2DF1F2511ED2C1300EFC8AE /* MAWeakArray.m */; };
C2DF1F2B11ED2C4700EFC8AE /* MAWeakDictionary.m in Sources */ = {isa = PBXBuildFile; fileRef = C2DF1F2A11ED2C4700EFC8AE /* MAWeakDictionary.m */; };
+ C65F68161459990300D3A417 /* NSTimer+MAWeakTimer.m in Sources */ = {isa = PBXBuildFile; fileRef = C65F68151459990300D3A417 /* NSTimer+MAWeakTimer.m */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
+ C2414C09144A5F2C0029A0D4 /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = /usr/share/man/man1/;
+ dstSubfolderSpec = 0;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 1;
+ };
C2D7540511E2588600816068 /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
@@ -31,6 +48,14 @@
/* Begin PBXFileReference section */
C208C95E11EBB8F100A8E38D /* MANotificationCenterAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MANotificationCenterAdditions.h; sourceTree = ""; };
C208C95F11EBB8F100A8E38D /* MANotificationCenterAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MANotificationCenterAdditions.m; sourceTree = ""; };
+ C23912C0144A54F900AEFD01 /* NativeZWRCheckeriPhone.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = NativeZWRCheckeriPhone.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ C23912C2144A54F900AEFD01 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };
+ C23912C5144A54F900AEFD01 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; };
+ C23912C9144A54F900AEFD01 /* NativeZWRCheckeriPhone-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "NativeZWRCheckeriPhone-Info.plist"; sourceTree = ""; };
+ C23912CD144A54F900AEFD01 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
+ C2414C0B144A5F2C0029A0D4 /* NativeZWRCheckerMac */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = NativeZWRCheckerMac; sourceTree = BUILT_PRODUCTS_DIR; };
+ C2414C19144A5F6F0029A0D4 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = SDKs/MacOSX10.7.sdk/System/Library/Frameworks/Cocoa.framework; sourceTree = DEVELOPER_DIR; };
+ C2414C1B144A5F8F0029A0D4 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = SDKs/MacOSX10.7.sdk/System/Library/Frameworks/AppKit.framework; sourceTree = DEVELOPER_DIR; };
C25675EF11E25C6A00CAB48E /* MAZeroingWeakRef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MAZeroingWeakRef.h; sourceTree = ""; };
C25675F011E25C6A00CAB48E /* MAZeroingWeakRef.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MAZeroingWeakRef.m; sourceTree = ""; };
C26F610311F207270080EC96 /* MAZeroingWeakProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MAZeroingWeakProxy.h; sourceTree = ""; };
@@ -43,9 +68,31 @@
C2DF1F2511ED2C1300EFC8AE /* MAWeakArray.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MAWeakArray.m; sourceTree = ""; };
C2DF1F2911ED2C4700EFC8AE /* MAWeakDictionary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MAWeakDictionary.h; sourceTree = ""; };
C2DF1F2A11ED2C4700EFC8AE /* MAWeakDictionary.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MAWeakDictionary.m; sourceTree = ""; };
+ C65F68141459990300D3A417 /* NSTimer+MAWeakTimer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSTimer+MAWeakTimer.h"; sourceTree = ""; };
+ C65F68151459990300D3A417 /* NSTimer+MAWeakTimer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSTimer+MAWeakTimer.m"; sourceTree = ""; };
+ C2EB6F77144B37A400278198 /* MAZeroingWeakRefNativeZWRNotAllowedTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MAZeroingWeakRefNativeZWRNotAllowedTable.h; sourceTree = ""; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
+ C23912BD144A54F900AEFD01 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ C23912C3144A54F900AEFD01 /* UIKit.framework in Frameworks */,
+ C23912C4144A54F900AEFD01 /* Foundation.framework in Frameworks */,
+ C23912C6144A54F900AEFD01 /* CoreGraphics.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ C2414C08144A5F2C0029A0D4 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ C2414C1C144A5F8F0029A0D4 /* AppKit.framework in Frameworks */,
+ C2414C0D144A5F2C0029A0D4 /* Foundation.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
C2D7540411E2588600816068 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
@@ -57,10 +104,22 @@
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
+ C23912C7144A54F900AEFD01 /* NativeZWRChecker */ = {
+ isa = PBXGroup;
+ children = (
+ C23912C9144A54F900AEFD01 /* NativeZWRCheckeriPhone-Info.plist */,
+ C23912CD144A54F900AEFD01 /* main.m */,
+ );
+ path = NativeZWRChecker;
+ sourceTree = "";
+ };
C2D753FA11E2588500816068 = {
isa = PBXGroup;
children = (
+ C2414C1B144A5F8F0029A0D4 /* AppKit.framework */,
+ C2414C19144A5F6F0029A0D4 /* Cocoa.framework */,
C2D7540111E2588600816068 /* Source */,
+ C23912C7144A54F900AEFD01 /* NativeZWRChecker */,
C2D7540811E2588600816068 /* Products */,
C2D7540A11E2588600816068 /* Frameworks */,
C2D7541111E2588600816068 /* Other Sources */,
@@ -81,6 +140,9 @@
C2DF1F2511ED2C1300EFC8AE /* MAWeakArray.m */,
C2DF1F2911ED2C4700EFC8AE /* MAWeakDictionary.h */,
C2DF1F2A11ED2C4700EFC8AE /* MAWeakDictionary.m */,
+ C65F68141459990300D3A417 /* NSTimer+MAWeakTimer.h */,
+ C65F68151459990300D3A417 /* NSTimer+MAWeakTimer.m */,
+ C2EB6F77144B37A400278198 /* MAZeroingWeakRefNativeZWRNotAllowedTable.h */,
);
path = Source;
sourceTree = "";
@@ -89,6 +151,8 @@
isa = PBXGroup;
children = (
C2D7540711E2588600816068 /* ZeroingWeakRef */,
+ C23912C0144A54F900AEFD01 /* NativeZWRCheckeriPhone.app */,
+ C2414C0B144A5F2C0029A0D4 /* NativeZWRCheckerMac */,
);
name = Products;
sourceTree = "";
@@ -97,6 +161,8 @@
isa = PBXGroup;
children = (
C2D7540B11E2588600816068 /* Foundation.framework */,
+ C23912C2144A54F900AEFD01 /* UIKit.framework */,
+ C23912C5144A54F900AEFD01 /* CoreGraphics.framework */,
);
name = Frameworks;
sourceTree = "";
@@ -112,6 +178,40 @@
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
+ C23912BF144A54F900AEFD01 /* NativeZWRCheckeriPhone */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = C23912D5144A54F900AEFD01 /* Build configuration list for PBXNativeTarget "NativeZWRCheckeriPhone" */;
+ buildPhases = (
+ C23912BC144A54F900AEFD01 /* Sources */,
+ C23912BD144A54F900AEFD01 /* Frameworks */,
+ C23912BE144A54F900AEFD01 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = NativeZWRCheckeriPhone;
+ productName = NativeZWRCheckeriPhone;
+ productReference = C23912C0144A54F900AEFD01 /* NativeZWRCheckeriPhone.app */;
+ productType = "com.apple.product-type.application";
+ };
+ C2414C0A144A5F2C0029A0D4 /* NativeZWRCheckerMac */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = C2414C15144A5F2C0029A0D4 /* Build configuration list for PBXNativeTarget "NativeZWRCheckerMac" */;
+ buildPhases = (
+ C2414C07144A5F2C0029A0D4 /* Sources */,
+ C2414C08144A5F2C0029A0D4 /* Frameworks */,
+ C2414C09144A5F2C0029A0D4 /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = NativeZWRCheckerMac;
+ productName = NativeZWRCheckerMac;
+ productReference = C2414C0B144A5F2C0029A0D4 /* NativeZWRCheckerMac */;
+ productType = "com.apple.product-type.tool";
+ };
C2D7540611E2588600816068 /* ZeroingWeakRef */ = {
isa = PBXNativeTarget;
buildConfigurationList = C2D7541511E2588600816068 /* Build configuration list for PBXNativeTarget "ZeroingWeakRef" */;
@@ -143,6 +243,7 @@
Japanese,
French,
German,
+ en,
);
mainGroup = C2D753FA11E2588500816068;
productRefGroup = C2D7540811E2588600816068 /* Products */;
@@ -150,11 +251,39 @@
projectRoot = "";
targets = (
C2D7540611E2588600816068 /* ZeroingWeakRef */,
+ C23912BF144A54F900AEFD01 /* NativeZWRCheckeriPhone */,
+ C2414C0A144A5F2C0029A0D4 /* NativeZWRCheckerMac */,
);
};
/* End PBXProject section */
+/* Begin PBXResourcesBuildPhase section */
+ C23912BE144A54F900AEFD01 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
/* Begin PBXSourcesBuildPhase section */
+ C23912BC144A54F900AEFD01 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ C23912CE144A54F900AEFD01 /* main.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ C2414C07144A5F2C0029A0D4 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ C2414C18144A5F690029A0D4 /* main.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
C2D7540311E2588600816068 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
@@ -165,12 +294,100 @@
C2DF1F2611ED2C1300EFC8AE /* MAWeakArray.m in Sources */,
C2DF1F2B11ED2C4700EFC8AE /* MAWeakDictionary.m in Sources */,
C26F610511F207270080EC96 /* MAZeroingWeakProxy.m in Sources */,
+ C65F68161459990300D3A417 /* NSTimer+MAWeakTimer.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
+ C23912D3144A54F900AEFD01 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(DEVELOPER_FRAMEWORKS_DIR)\"",
+ );
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
+ INFOPLIST_FILE = "NativeZWRCheckeriPhone/NativeZWRCheckeriPhone-Info.plist";
+ IPHONEOS_DEPLOYMENT_TARGET = 5.0;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ WRAPPER_EXTENSION = app;
+ };
+ name = Debug;
+ };
+ C23912D4144A54F900AEFD01 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = YES;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(DEVELOPER_FRAMEWORKS_DIR)\"",
+ );
+ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
+ INFOPLIST_FILE = "NativeZWRCheckeriPhone/NativeZWRCheckeriPhone-Info.plist";
+ IPHONEOS_DEPLOYMENT_TARGET = 5.0;
+ OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ WRAPPER_EXTENSION = app;
+ };
+ name = Release;
+ };
+ C2414C16144A5F2C0029A0D4 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.7;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = macosx;
+ };
+ name = Debug;
+ };
+ C2414C17144A5F2C0029A0D4 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.7;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = macosx;
+ };
+ name = Release;
+ };
C2D7541311E2588600816068 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
@@ -183,7 +400,6 @@
GCC_WARN_UNUSED_VARIABLE = YES;
ONLY_ACTIVE_ARCH = YES;
PREBINDING = NO;
- SDKROOT = macosx10.6;
};
name = Debug;
};
@@ -196,7 +412,6 @@
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
PREBINDING = NO;
- SDKROOT = macosx10.6;
};
name = Release;
};
@@ -233,6 +448,24 @@
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
+ C23912D5144A54F900AEFD01 /* Build configuration list for PBXNativeTarget "NativeZWRCheckeriPhone" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ C23912D3144A54F900AEFD01 /* Debug */,
+ C23912D4144A54F900AEFD01 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ C2414C15144A5F2C0029A0D4 /* Build configuration list for PBXNativeTarget "NativeZWRCheckerMac" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ C2414C16144A5F2C0029A0D4 /* Debug */,
+ C2414C17144A5F2C0029A0D4 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
C2D753FF11E2588500816068 /* Build configuration list for PBXProject "ZeroingWeakRef" */ = {
isa = XCConfigurationList;
buildConfigurations = (
diff --git a/ZeroingWeakRef.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ZeroingWeakRef.xcodeproj/project.xcworkspace/contents.xcworkspacedata
old mode 100644
new mode 100755
diff --git a/ZeroingWeakRef.xcodeproj/project.xcworkspace/xcuserdata/mikeash.xcuserdatad/WorkspaceState.xcuserstate b/ZeroingWeakRef.xcodeproj/project.xcworkspace/xcuserdata/mikeash.xcuserdatad/WorkspaceState.xcuserstate
old mode 100644
new mode 100755