About | Buy | Forum | Industry Watch | Learning Curve | Products | Search | Twitter | Xnews
Home » Learning Curve

Why Cocoa Bloat is Nonsense

This is for 'developers' who still don't have a clue but it's primarily for you, end user. Read on.


Buy It

Try It

With the advent of 'trimmer' applications there's been (thankfully) an increased awareness not so much of bloat but of sloppiness in the way third party software houses package their products. Apple today release their binaries with multiple executables - not just Intel and PowerPC but 32-bit Intel and PowerPC and 64-bit Intel and PowerPC. Obviously only one of all of them is ever going to be run and the others, if removed, could save disk space - and yet it's not here the bloat and sloppiness come in.

The bloat and sloppiness come in the packaging itself.

Users who have no clue what this is all about may be puzzled. Why would a developer ship things that aren't used? Are all these files in the download really not used, really not needed?

The answer is an unequivocal 'yes' and here's the proof.

The NIB Bloat

'NIB' stands for 'NeXTSTEP Interface Builder'. Interface Builder is an application built by Jean-Marie Hullot from his original SOS Interface that essentially revolutionised GUI application design and development. [And NeXT and then Apple are still unique in taking things to this level.]

NIB files are the 'freeze dried' components of a Cocoa application. They contain the basic layout of the windows, the panels, the various controls such as push buttons, combo boxes, scroll bars, text fields, table views, outline views - all of that. And they're all connected together and with the application code automatically right there in the NIB files. [It's easy to see why Steve Jobs went ga-ga when he first saw the precursor SOS Interface and hired on Jean-Marie on the spot.]

Interface Builder lets the developer sketch out the application graphically and tie together the code to the layout and vice versa. A GUI application represents an interface between the user and the program [its 'model'] so user actions affect the program's data and internal changes in this data are reflected in the 'GUI' [the 'view'].

Interface Builder uses three files to accomplish its task. The 'NIB' which shows up when browsing the internals of Cocoa applications isn't a file at all - it's a directory. And this directory in turn contains the three (or more) files Interface Builder needs.

  1. classes.nib
  2. info.nib
  3. objects.nib or keyedobjects.nib
  4. data.dependency

What's important to understand is even though Interface Builder creates the 'NIB' only one of these files is used once the product is 'released' - objects.nib/keyedobjects.nib. All the others are just 'scratchpad' files for Interface Builder used only during development and are supposed to be cleaned out for the release package.

After all - Apple do it, don't they? Yes they do. So what is with all these third party developers?

Good question. Let's look inside a few typical Interface Builder 'scratchpad' files and see what we find.

classes.nib

Here's a classes.nib from a typical Cocoa project - the ACP applet 'ArchInfo'. [The file's not shipped as it's not used.]

{
    IBClasses = (
        {
            CLASS = ArchInfo;
            LANGUAGE = ObjC;
            OUTLETS = {tv = id; w = id; };
            SUPERCLASS = NSObject;
        },
        {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
        {
            ACTIONS = {showHelp = id; };
            CLASS = Rx;
            LANGUAGE = ObjC;
            SUPERCLASS = NSObject;
        },
        {
            ACTIONS = {d = id; e = id; f = id; g = id; j = id; };
            CLASS = Rxf;
            LANGUAGE = ObjC;
            SUPERCLASS = NSObject;
        },
        {CLASS = Rxt; LANGUAGE = ObjC; SUPERCLASS = NSTableView; },
        {CLASS = Rxt2; LANGUAGE = ObjC; SUPERCLASS = Rxt; }
    );
    IBVersion = 1;
}

classes.nib is a scratchpad file - in plain text. It doesn't 'run'. It doesn't have any executable code. All it does is help Interface Builder keep track of what's inside the actual 'code' that is run.

info.nib

Here's info.nib from the same 'ArchInfo' project. [The file's not shipped as it's not used.]

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>IBDocumentLocation</key>
    <string>17 33 356 240 0 0 1440 878 </string>
    <key>IBEditorPositions</key>
    <dict>
        <key>29</key>
        <string>183 329 248 44 0 0 1440 878 </string>
    </dict>
    <key>IBFramework Version</key>
    <string>446.1</string>
    <key>IBOpenObjects</key>
    <array>
        <integer>21</integer>
        <integer>29</integer>
    </array>
    <key>IBSystem Version</key>
    <string>8N1430</string>
</dict>
</plist>

This one is even easier to figure out: it's a property list file. And property list files don't run either.

  • IBDocumentLocation: this tells Interface Builder where to put its main window on screen when it opens this NIB. But you're not running Interface Builder when you use your application - for you as the user of this application this data is worthless.
  • IBEditorPositions: same thing.
  • IBFramework Version, IBOpenObjects, IBSystem Version: internal bookkeeping for Interface Builder. So it knows what components are being used - for example if a NIB needs to be updated with a newer version of Interface Builder running. This 'data' has no relevance for you the user at runtime. Apple do not ship this file either.

data.dependency is another NIB file that turns up at times - it tells IB what other frameworks/palettes are to be loaded to properly edit the NIB. But it too has less than zero relevance at runtime - which is why you'd search far and wide to find one in any Apple release software.

The above files are comparatively small, most of the time a kilobyte or two. But the basic rule (as you may know) is that your file system deals in bigger aggregates than the byte - it deals in clusters. A 'cluster' is the smallest possible 'I/O' (input/output) data block. On OS X that's 4 KB. So each unneeded classes.nib, info.nib, and data.dependency you have in any NIB anywhere is going to cost you an additional 4 KB.

Do the math. Most NIBs contain two of the three above files. Most applications have a whole slew of NIBs. Most hard drives have a whole slew of third party applications. Add it up.

objects.nib on the other hand is where Interface Builder stores the data to be used at runtime. Checking out the contents of an objects.nib with a text editor isn't going to be as successful as with the other NIB files - it's code. It's 'freeze dried' (archived) Cocoa class code. It's 'unarchived' at runtime by the program loader and put into action with everything ready to run.

Here's a hex dump of objects.nib from the 'ArchInfo' project. It's gibberish - it's code.

00000000  04 0b 73 74 72 65 61 6d  74 79 70 65 64 81 e8 03  |..streamtyped...|
00000010  84 01 40 84 84 84 0e 4e  53 49 42 4f 62 6a 65 63  |..@....NSIBObjec|
00000020  74 44 61 74 61 81 e0 00  84 84 08 4e 53 4f 62 6a  |tData......NSObj|
00000030  65 63 74 00 85 92 84 84  84 0e 4e 53 43 75 73 74  |ect.......NSCust|
00000040  6f 6d 4f 62 6a 65 63 74  29 94 84 02 40 40 84 84  |omObject)...@@..|
00000050  84 0f 4e 53 4d 75 74 61  62 6c 65 53 74 72 69 6e  |..NSMutableStrin|
00000060  67 01 84 84 08 4e 53 53  74 72 69 6e 67 01 94 84  |g....NSString...|
00000070  01 2b 0d 4e 53 41 70 70  6c 69 63 61 74 69 6f 6e  |.+.NSApplication|
00000080  86 85 86 84 01 69 3d 96  84 84 84 0a 4e 53 4d 65  |.....i=.....NSMe|
00000090  6e 75 49 74 65 6d 81 9f  02 94 92 84 84 84 06 4e  |nuItem.........N|
000000a0  53 4d 65 6e 75 81 cc 00  94 84 04 69 40 40 40 00  |SMenu......i@@@.|
000000b0  84 99 99 08 41 72 63 68  49 6e 66 6f 86 84 84 84  |....ArchInfo....|
000000c0  0e 4e 53 4d 75 74 61 62  6c 65 41 72 72 61 79 00  |.NSMutableArray.|
000000d0  84 84 07 4e 53 41 72 72  61 79 00 94 9a 09 92 84  |...NSArray......|
000000e0  9b 92 9c 84 0d 69 40 40  49 49 69 40 40 40 40 3a  |.....i@@IIi@@@@:|
000000f0  69 40 00 84 99 99 0e 41  62 6f 75 74 20 41 72 63  |i@.....About Arc|
00000100  68 49 6e 66 6f 86 84 99  99 00 86 00 82 ff ff ff  |hInfo...........|
00000110  7f 00 85 84 84 84 10 4e  53 43 75 73 74 6f 6d 52  |.......NSCustomR|
00000120  65 73 6f 75 72 63 65 29  94 96 84 99 99 07 4e 53  |esource)......NS|
00000130  49 6d 61 67 65 86 84 99  99 0f 4e 53 4d 65 6e 75  |Image.....NSMenu|
00000140  43 68 65 63 6b 6d 61 72  6b 86 86 85 84 a6 96 a7  |Checkmark.......|
00000150  84 99 99 10 4e 53 4d 65  6e 75 4d 69 78 65 64 53  |....NSMenuMixedS|
00000160  74 61 74 65 86 86 85 00  85 92 85 92 85 86 92 84  |tate............|
00000170  9b 92 9c a0 82 00 00 00  c0 a4 a4 82 00 00 10 00  |................|
00000180  82 ff ff ff 7f 00 85 a5  85 a9 85 00 85 92 85 92  |................|
00000190  85 86 92 84 9b 92 9c a0  00 84 99 99 08 53 65 72  |.............Ser|
000001a0  76 69 63 65 73 86 a4 82  00 00 10 00 82 ff ff ff  |vices...........|
000001b0  7f 00 85 a5 85 a9 84 0e  73 75 62 6d 65 6e 75 41  |........submenuA|
000001c0  63 74 69 6f 6e 3a 00 85  92 85 92 84 9d 9d 00 84  |ction:..........|
000001d0  98 99 08 53 65 72 76 69  63 65 73 86 84 a0 9a 00  |...Services.....|
000001e0  86 84 99 99 0f 5f 4e 53  53 65 72 76 69 63 65 73  |....._NSServices|
000001f0  4d 65 6e 75 86 86 86 92  84 9b 92 9c a0 82 00 00  |Menu............|
00000200  00 c0 a4 a4 82 00 00 10  00 82 ff ff ff 7f 00 85  |................|
00000210  a5 85 a9 85 00 85 92 85  92 85 86 92 84 9b 92 9c  |................|
00000220  a0 00 84 99 99 0d 48 69  64 65 20 41 72 63 68 49  |......Hide ArchI|
00000230  6e 66 6f 86 84 99 99 01  68 86 82 00 00 10 00 82  |nfo.....h.......|
00000240  ff ff ff 7f 00 85 a5 85  a9 85 00 85 92 85 92 85  |................|
00000250  86 92 84 9b 92 9c a0 00  84 99 99 0b 48 69 64 65  |............Hide|
00000260  20 4f 74 68 65 72 73 86  84 99 99 01 68 86 82 00  | Others.....h...|
00000270  00 18 00 82 ff ff ff 7f  00 85 a5 85 a9 85 00 85  |................|
00000280  92 85 92 85 86 92 9a 92  84 9b 92 9c a0 82 00 00  |................|
00000290  00 c0 a4 a4 82 00 00 10  00 82 ff ff ff 7f 00 85  |................|
000002a0  a5 85 a9 85 00 85 92 85  92 85 86 92 84 9b 92 9c  |................|
000002b0  a0 00 84 99 99 0d 51 75  69 74 20 41 72 63 68 49  |......Quit ArchI|
000002c0  6e 66 6f 86 84 99 99 01  71 86 82 00 00 10 00 82  |nfo.....q.......|
000002d0  ff ff ff 7f 00 85 a5 85  a9 85 00 85 92 85 92 85  |................|
000002e0  86 86 84 99 99 0c 5f 4e  53 41 70 70 6c 65 4d 65  |......_NSAppleMe|
000002f0  6e 75 86 86 a0 00 84 99  99 08 53 68 6f 77 20 41  |nu........Show A|
00000300  6c 6c 86 a4 82 00 00 10  00 82 ff ff ff 7f 00 85  |ll..............|
00000310  a5 85 a9 85 00 85 92 85  92 85 86 9c 96 84 84 84  |................|
00000320  0e 4e 53 43 6c 61 73 73  53 77 61 70 70 65 72 2a  |.NSClassSwapper*|
00000330  94 84 02 40 23 84 99 99  04 52 78 74 32 86 84 84  |...@#....Rxt2...|
00000340  0b 4e 53 54 61 62 6c 65  56 69 65 77 3d 84 84 09  |.NSTableView=...|
00000350  4e 53 43 6f 6e 74 72 6f  6c 29 84 84 06 4e 53 56  |NSControl)...NSV|
00000360  69 65 77 29 84 84 0b 4e  53 52 65 73 70 6f 6e 64  |iew)...NSRespond|
00000370  65 72 00 94 92 84 84 84  0a 4e 53 43 6c 69 70 56  |er.......NSClipV|
00000380  69 65 77 3a c4 92 84 84  84 0c 4e 53 53 63 72 6f  |iew:......NSScro|
00000390  6c 6c 56 69 65 77 81 e2  00 c4 92 84 c4 92 85 9a  |llView..........|
000003a0  00 84 0c 40 40 40 40 66  66 66 66 66 66 66 66 84  |...@@@@ffffffff.|
000003b0  a0 9a 01 92 c8 86 85 85  85 01 09 81 1c 02 81 bf  |................|
000003c0  00 00 00 81 1c 02 81 bf  00 92 85 92 85 92 85 92  |................|
000003d0  85 86 9a 82 00 00 80 12  ab 84 a0 9a 05 92 c6 92  |................|
000003e0  84 84 84 0a 4e 53 53 63  72 6f 6c 6c 65 72 81 d3  |....NSScroller..|
000003f0  00 c3 92 c8 9a 82 00 00  80 00 ab 85 85 85 85 81  |................|
00000400  0e 02 11 0f 81 a0 00 00  00 0f 81 a0 00 92 c8 92  |................|
00000410  85 92 85 92 85 84 04 69  63 63 40 00 00 00 85 92  |.......icc@.....|
00000420  c8 84 03 66 66 3a 00 83  66 66 7e 3f 84 0c 5f 64  |...ff:..ff~?.._d|
00000430  6f 53 63 72 6f 6c 6c 65  72 3a 84 01 63 00 b0 00  |oScroller:..c...|
00000440  86 92 84 ce 92 c8 9a 82  00 00 80 00 ab 85 85 85  |................|
00000450  85 01 81 b1 00 81 0d 02  0f 00 00 81 0d 02 0f 92  |................|
00000460  c8 92 85 92 85 92 85 ad  00 00 00 85 92 c8 ae 00  |................|
00000470  83 68 83 7f 3f af b0 01  b0 00 86 92 84 c7 92 c8  |.h..?...........|
00000480  9a 82 00 00 c0 00 ab 84  a0 9a 01 92 84 84 84 11  |................|
00000490  4e 53 54 61 62 6c 65 48  65 61 64 65 72 56 69 65  |NSTableHeaderVie|
000004a0  77 1c c4 92 d0 9a 82 00  00 80 00 ab 85 85 85 85  |w...............|
000004b0  00 00 81 0d 02 11 00 00  81 0d 02 11 92 d0 92 85  |................|
000004c0  92 85 92 85 92 bf 86 86  85 85 85 01 00 81 0d 02  |................|
000004d0  11 00 00 81 0d 02 11 92  c8 92 85 92 d2 92 85 92  |................|
000004e0  d2 84 05 40 40 63 63 63  84 84 84 07 4e 53 43 6f  |...@@ccc....NSCo|
000004f0  6c 6f 72 00 94 b0 06 84  03 40 40 40 84 99 99 06  |lor......@@@....|
00000500  53 79 73 74 65 6d 86 84  99 99 16 63 6f 6e 74 72  |System.....contr|
00000510  6f 6c 42 61 63 6b 67 72  6f 75 6e 64 43 6f 6c 6f  |olBackgroundColo|
00000520  72 86 84 d5 b0 03 84 02  66 66 83 ab aa 2a 3f 01  |r.......ff...*?.|
00000530  86 86 85 00 00 01 86 92  84 84 84 0d 5f 4e 53 43  |............_NSC|
00000540  6f 72 6e 65 72 56 69 65  77 00 c4 92 c8 9a 82 00  |ornerView.......|
00000550  00 80 00 ab 85 85 85 85  81 0e 02 00 10 11 00 00  |................|
00000560  10 11 92 c8 92 85 92 85  92 85 86 86 85 85 85 ff  |................|
00000570  ff 81 1e 02 81 c1 00 00  00 81 1e 02 81 c1 00 92  |................|
00000580  ca 92 85 92 c6 92 85 92  cd 92 cf 92 c6 92 d0 92  |................|
00000590  d9 84 05 66 66 66 66 69  00 00 10 10 82 00 00 00  |...ffffi........|
000005a0  c4 86 9a 82 00 00 c0 00  ab 84 a0 9a 01 92 bf 86  |................|
000005b0  85 85 85 01 11 81 0d 02  81 a0 00 00 00 81 0d 02  |................|
000005c0  81 a0 00 92 c8 92 85 92  bf 92 85 92 bf b2 d4 85  |................|
000005d0  00 00 01 86 9a 82 00 00  90 00 ab 85 85 85 85 00  |................|
000005e0  00 81 0d 02 81 a0 00 00  00 81 0d 02 81 a0 00 92  |................|
000005f0  c6 92 85 92 85 92 85 ad  00 01 00 85 84 0b 40 40  |..............@@|
00000600  40 66 66 40 40 66 3a 3a  69 d2 d9 84 a0 9a 05 92  |@ff@@f::i.......|
00000610  84 84 84 0d 4e 53 54 61  62 6c 65 43 6f 6c 75 6d  |....NSTableColum|
00000620  6e 29 94 84 08 40 66 66  66 40 40 63 63 84 99 99  |n)...@fff@@cc...|
00000630  01 30 86 4f 00 81 0f 27  84 84 84 11 4e 53 54 61  |.0.O...'....NSTa|
00000640  62 6c 65 48 65 61 64 65  72 43 65 6c 6c 1c 84 84  |bleHeaderCell...|
00000650  0f 4e 53 54 65 78 74 46  69 65 6c 64 43 65 6c 6c  |.NSTextFieldCell|
00000660  3e 84 84 0c 4e 53 41 63  74 69 6f 6e 43 65 6c 6c  |>...NSActionCell|
00000670  11 84 84 06 4e 53 43 65  6c 6c 41 94 84 02 69 69  |....NSCellA...ii|
00000680  82 00 fe 01 04 00 84 04  40 40 40 40 84 99 99 04  |........@@@@....|
00000690  6e 61 6d 65 86 84 84 84  06 4e 53 46 6f 6e 74 1e  |name.....NSFont.|
000006a0  94 9a 24 84 05 5b 33 36  63 5d 06 00 00 00 1a 00  |..$..[36c]......|
000006b0  00 00 ff fe 4c 00 75 00  63 00 69 00 64 00 61 00  |....L.u.c.i.d.a.|
000006c0  47 00 72 00 61 00 6e 00  64 00 65 00 00 00 84 01  |G.r.a.n.d.e.....|
000006d0  66 0b b0 00 b0 01 b0 00  b0 0c 86 85 85 84 02 69  |f..............i|
000006e0  3a 00 85 92 85 92 85 84  03 63 40 40 00 84 d5 b0  |:........c@@....|
000006f0  06 b4 d6 84 99 99 0b 68  65 61 64 65 72 43 6f 6c  |.......headerCol|
00000700  6f 72 86 84 d5 b0 03 b5  01 01 86 86 84 d5 b0 06  |or..............|
00000710  b4 d6 84 99 99 0f 68 65  61 64 65 72 54 65 78 74  |......headerText|
00000720  43 6f 6c 6f 72 86 84 d5  b0 03 b5 00 01 86 86 86  |Color...........|
00000730  84 e2 bf 82 40 fe 21 14  81 00 08 c0 85 85 85 85  |....@.!.........|
00000740  c4 00 85 92 85 92 bf c5  00 d4 84 d5 b0 06 b4 d6  |................|
00000750  84 99 99 10 63 6f 6e 74  72 6f 6c 54 65 78 74 43  |....controlTextC|
00000760  6f 6c 6f 72 86 ed 86 86  01 00 92 bf 86 92 84 de  |olor............|
00000770  ba 84 99 99 01 31 86 4f  00 81 0f 27 84 e1 bf 82  |.....1.O...'....|
00000780  00 fe 01 04 00 c0 84 99  99 07 63 70 75 74 79 70  |..........cputyp|
00000790  65 86 e6 85 85 c4 00 85  92 85 92 85 c5 00 e8 eb  |e...............|
000007a0  86 84 e2 bf 82 40 fe 21  14 81 00 08 c0 85 85 85  |.....@.!........|
000007b0  85 c4 00 85 92 85 92 bf  c5 00 d4 ef 86 01 00 92  |................|
000007c0  bf 86 92 84 de ba 84 99  99 01 32 86 4f 00 81 0f  |..........2.O...|
000007d0  27 84 e1 bf 82 00 fe 01  04 00 c0 84 99 99 0a 63  |'..............c|
000007e0  70 75 73 75 62 74 79 70  65 86 e6 85 85 c4 00 85  |pusubtype.......|
000007f0  92 85 92 85 c5 00 e8 eb  86 84 e2 bf 82 40 fe 21  |.............@.!|
00000800  14 81 00 08 c0 85 85 85  85 c4 00 85 92 85 92 bf  |................|
00000810  c5 00 d4 ef 86 01 00 92  bf 86 92 84 de ba 84 99  |................|
00000820  99 01 33 86 81 80 00 00  81 0f 27 84 e1 bf 82 00  |..3.......'.....|
00000830  fe 01 04 00 c0 84 99 99  09 62 79 74 65 6f 72 64  |.........byteord|
00000840  65 72 86 e6 85 85 c4 00  85 92 85 92 85 c5 00 e8  |er..............|
00000850  eb 86 84 e2 bf 82 40 fe  21 14 81 00 08 c0 85 85  |......@.!.......|
00000860  85 85 c4 00 85 92 85 92  bf c5 00 d4 ef 86 01 00  |................|
00000870  92 bf 86 92 84 de ba 84  99 99 01 34 86 81 91 00  |...........4....|
00000880  00 81 0f 27 84 e1 bf 82  00 fe 01 04 00 c0 84 99  |...'............|
00000890  99 0b 64 65 73 63 72 69  70 74 69 6f 6e 86 e6 85  |..description...|
000008a0  85 c4 00 85 92 85 92 85  c5 00 e8 eb 86 84 e2 bf  |................|
000008b0  82 40 fe 21 14 81 00 08  c0 85 85 85 85 c4 00 85  |.@.!............|
000008c0  92 85 92 bf c5 00 d4 ef  86 01 00 92 bf 86 86 03  |................|
000008d0  02 ea 84 d5 b0 06 b4 d6  84 99 99 09 67 72 69 64  |............grid|
000008e0  43 6f 6c 6f 72 86 84 d5  b0 03 b5 83 00 00 00 3f  |Color..........?|
000008f0  01 86 86 0e 85 85 82 00  00 40 5a 92 85 92 85 92  |.........@Z.....|
00000900  85 86 c8 96 f6 bf 96 84  9b 92 84 9d 9d 00 84 98  |................|
00000910  99 04 45 64 69 74 86 84  a0 9a 0c 92 84 9b 92 09  |..Edit..........|
00000920  a0 00 84 99 99 04 55 6e  64 6f 86 84 99 99 01 7a  |......Undo.....z|
00000930  86 82 00 00 10 00 82 ff  ff ff 7f 00 85 a5 85 a9  |................|
00000940  85 00 85 92 85 92 85 86  92 84 9b 92 09 a0 00 84  |................|
00000950  99 99 04 52 65 64 6f 86  84 99 99 01 5a 86 82 00  |...Redo.....Z...|
00000960  00 10 00 82 ff ff ff 7f  00 85 a5 85 a9 85 00 85  |................|
00000970  92 85 92 85 86 92 84 9b  92 09 a0 82 00 00 00 c0  |................|
00000980  a4 a4 82 00 00 10 00 82  ff ff ff 7f 00 85 a5 85  |................|
00000990  a9 85 00 85 92 85 92 85  86 92 84 9b 92 09 a0 00  |................|
000009a0  84 99 99 03 43 75 74 86  84 99 99 01 78 86 82 00  |....Cut.....x...|
000009b0  00 10 00 82 ff ff ff 7f  00 85 a5 85 a9 85 00 85  |................|
000009c0  92 85 92 85 86 92 84 9b  92 09 a0 00 84 99 99 04  |................|
000009d0  43 6f 70 79 86 84 99 99  01 63 86 82 00 00 10 00  |Copy.....c......|
000009e0  82 ff ff ff 7f 00 85 a5  85 a9 85 00 85 92 85 92  |................|
000009f0  85 86 92 84 9b 92 09 a0  00 84 99 99 05 50 61 73  |.............Pas|
00000a00  74 65 86 84 99 99 01 76  86 82 00 00 10 00 82 ff  |te.....v........|
00000a10  ff ff 7f 00 85 a5 85 a9  85 00 85 92 85 92 85 86  |................|
00000a20  92 08 92 84 9b 92 09 a0  00 84 99 99 0a 53 65 6c  |.............Sel|
00000a30  65 63 74 20 41 6c 6c 86  84 99 99 01 61 86 82 00  |ect All.....a...|
00000a40  00 10 00 82 ff ff ff 7f  00 85 a5 85 a9 85 00 85  |................|
00000a50  92 85 92 85 86 92 84 9b  92 09 a0 82 00 00 00 c0  |................|
00000a60  a4 a4 82 00 00 10 00 82  ff ff ff 7f 00 85 a5 85  |................|
00000a70  a9 85 00 85 92 85 92 85  86 92 84 9b 92 09 a0 00  |................|
00000a80  84 99 99 04 46 69 6e 64  86 a4 82 00 00 10 00 82  |....Find........|
00000a90  ff ff ff 7f 00 85 a5 85  a9 a2 00 85 92 85 92 84  |................|
00000aa0  9d 9d 00 84 98 99 04 46  69 6e 64 86 84 a0 9a 05  |.......Find.....|
00000ab0  92 84 9b 92 22 a0 00 84  99 99 07 46 69 6e 64 e2  |...."......Find.|
00000ac0  80 a6 86 84 99 99 01 66  86 82 00 00 10 00 82 ff  |.......f........|
00000ad0  ff ff 7f 00 85 a5 85 a9  85 01 85 92 85 92 85 86  |................|
00000ae0  92 84 9b 92 22 a0 00 84  99 99 09 46 69 6e 64 20  |...."......Find |
00000af0  4e 65 78 74 86 84 99 99  01 67 86 82 00 00 10 00  |Next.....g......|
00000b00  82 ff ff ff 7f 00 85 a5  85 a9 85 02 85 92 85 92  |................|
00000b10  85 86 92 84 9b 92 22 a0  00 84 99 99 0d 46 69 6e  |......"......Fin|
00000b20  64 20 50 72 65 76 69 6f  75 73 86 84 99 99 01 64  |d Previous.....d|
00000b30  86 82 00 00 10 00 82 ff  ff ff 7f 00 85 a5 85 a9  |................|
00000b40  85 03 85 92 85 92 85 86  92 84 9b 92 22 a0 00 84  |............"...|
00000b50  99 99 16 55 73 65 20 53  65 6c 65 63 74 69 6f 6e  |...Use Selection|
00000b60  20 66 6f 72 20 46 69 6e  64 86 84 99 99 01 65 86  | for Find.....e.|
00000b70  82 00 00 10 00 82 ff ff  ff 7f 00 85 a5 85 a9 85  |................|
00000b80  07 85 92 85 92 85 86 92  84 9b 92 22 a0 00 84 99  |..........."....|
00000b90  99 11 4a 75 6d 70 20 74  6f 20 53 65 6c 65 63 74  |..Jump to Select|
00000ba0  69 6f 6e 86 84 99 99 01  6a 86 82 00 00 10 00 82  |ion.....j.......|
00000bb0  ff ff ff 7f 00 85 a5 85  a9 85 00 85 92 85 92 85  |................|
00000bc0  86 86 85 86 86 92 84 9b  92 09 a0 00 84 99 99 08  |................|
00000bd0  53 70 65 6c 6c 69 6e 67  86 a4 82 00 00 10 00 82  |Spelling........|
00000be0  ff ff ff 7f 00 85 a5 85  a9 a2 00 85 92 85 92 84  |................|
00000bf0  9d 9d 00 84 99 99 08 53  70 65 6c 6c 69 6e 67 86  |.......Spelling.|
00000c00  84 a0 9a 03 92 84 9b 92  36 a0 00 84 99 99 0b 53  |........6......S|
00000c10  70 65 6c 6c 69 6e 67 e2  80 a6 86 84 99 99 01 3a  |pelling........:|
00000c20  86 82 00 00 10 00 82 ff  ff ff 7f 00 85 a5 85 a9  |................|
00000c30  85 00 85 92 85 92 85 86  92 84 9b 92 36 a0 00 84  |............6...|
00000c40  99 99 0e 43 68 65 63 6b  20 53 70 65 6c 6c 69 6e  |...Check Spellin|
00000c50  67 86 84 99 99 01 3b 86  82 00 00 10 00 82 ff ff  |g.....;.........|
00000c60  ff 7f 00 85 a5 85 a9 85  00 85 92 85 92 85 86 92  |................|
00000c70  84 9b 92 36 a0 00 84 99  99 1a 43 68 65 63 6b 20  |...6......Check |
00000c80  53 70 65 6c 6c 69 6e 67  20 61 73 20 59 6f 75 20  |Spelling as You |
00000c90  54 79 70 65 86 a4 82 00  00 10 00 82 ff ff ff 7f  |Type............|
00000ca0  00 85 a5 85 a9 85 00 85  92 85 92 85 86 86 85 86  |................|
00000cb0  86 92 84 9b 92 09 a0 00  84 99 99 06 53 70 65 65  |............Spee|
00000cc0  63 68 86 a4 82 00 00 10  00 82 ff ff ff 7f 00 85  |ch..............|
00000cd0  a5 85 a9 a2 00 85 92 85  92 84 9d 9d 00 84 99 99  |................|
00000ce0  06 53 70 65 65 63 68 86  84 a0 9a 02 92 84 9b 92  |.Speech.........|
00000cf0  43 a0 00 84 99 99 0e 53  74 61 72 74 20 53 70 65  |C......Start Spe|
00000d00  61 6b 69 6e 67 86 a4 82  00 00 10 00 82 ff ff ff  |aking...........|
00000d10  7f 00 85 a5 85 a9 85 00  85 92 85 92 85 86 92 84  |................|
00000d20  9b 92 43 a0 00 84 99 99  0d 53 74 6f 70 20 53 70  |..C......Stop Sp|
00000d30  65 61 6b 69 6e 67 86 a4  82 00 00 10 00 82 ff ff  |eaking..........|
00000d40  ff 7f 00 85 a5 85 a9 85  00 85 92 85 92 85 86 86  |................|
00000d50  85 86 86 86 85 86 a0 00  84 99 99 06 44 65 6c 65  |............Dele|
00000d60  74 65 86 a4 82 00 00 10  00 82 ff ff ff 7f 00 85  |te..............|
00000d70  a5 85 a9 85 00 85 92 85  92 85 86 09 96 a2 9c 96  |................|
00000d80  84 9b 92 84 9d 9d 00 84  98 99 06 57 69 6e 64 6f  |...........Windo|
00000d90  77 86 84 a0 9a 04 92 84  9b 92 4c a0 00 84 99 99  |w.........L.....|
00000da0  08 4d 69 6e 69 6d 69 7a  65 86 84 99 99 01 6d 86  |.Minimize.....m.|
00000db0  82 00 00 10 00 82 ff ff  ff 7f 00 85 a5 85 a9 85  |................|
00000dc0  00 85 92 85 92 85 86 92  84 9b 92 4c a0 00 84 99  |...........L....|
00000dd0  99 04 5a 6f 6f 6d 86 a4  82 00 00 10 00 82 ff ff  |..Zoom..........|
00000de0  ff 7f 00 85 a5 85 a9 85  00 85 92 85 92 85 86 92  |................|
00000df0  84 9b 92 4c a0 82 00 00  00 c0 a4 a4 82 00 00 10  |...L............|
00000e00  00 82 ff ff ff 7f 00 85  a5 85 a9 85 00 85 92 85  |................|
00000e10  92 85 86 92 4b 86 84 99  99 0e 5f 4e 53 57 69 6e  |....K....._NSWin|
00000e20  64 6f 77 73 4d 65 6e 75  86 86 a0 00 84 99 99 12  |dowsMenu........|
00000e30  42 72 69 6e 67 20 41 6c  6c 20 74 6f 20 46 72 6f  |Bring All to Fro|
00000e40  6e 74 86 a4 82 00 00 10  00 82 ff ff ff 7f 00 85  |nt..............|
00000e50  a5 85 a9 85 00 85 92 85  92 85 86 4c 96 13 09 96  |...........L....|
00000e60  43 41 96 84 9b 92 84 9d  9d 00 84 99 99 08 4d 61  |CA............Ma|
00000e70  69 6e 4d 65 6e 75 86 84  a0 9a 04 92 57 92 84 9b  |inMenu......W...|
00000e80  92 58 a0 00 84 99 99 04  45 64 69 74 86 a4 82 00  |.X......Edit....|
00000e90  00 10 00 82 ff ff ff 7f  00 85 a5 85 a9 a2 00 85  |................|
00000ea0  92 85 92 09 86 92 84 9b  92 58 a0 00 84 99 99 06  |.........X......|
00000eb0  57 69 6e 64 6f 77 86 a4  82 00 00 10 00 82 ff ff  |Window..........|
00000ec0  ff 7f 00 85 a5 85 a9 a2  00 85 92 85 92 4c 86 92  |.............L..|
00000ed0  84 9b 92 58 a0 00 84 99  99 04 48 65 6c 70 86 a4  |...X......Help..|
00000ee0  82 00 00 10 00 82 ff ff  ff 7f 00 85 a5 85 a9 a2  |................|
00000ef0  00 85 92 85 92 84 9d 9d  00 84 99 99 04 48 65 6c  |.............Hel|
00000f00  70 86 84 a0 9a 01 92 84  9b 92 61 a0 00 84 99 99  |p.........a.....|
00000f10  0d 41 72 63 68 49 6e 66  6f 20 48 65 6c 70 86 84  |.ArchInfo Help..|
00000f20  99 99 01 3f 86 82 00 00  10 00 82 ff ff ff 7f 00  |...?............|
00000f30  85 a5 85 a9 85 00 85 92  85 92 85 86 86 85 86 86  |................|
00000f40  86 84 99 99 0b 5f 4e 53  4d 61 69 6e 4d 65 6e 75  |....._NSMainMenu|
00000f50  86 86 a0 00 84 99 99 08  41 72 63 68 49 6e 66 6f  |........ArchInfo|
00000f60  86 a4 82 00 00 10 00 82  ff ff ff 7f 00 85 a5 85  |................|
00000f70  a9 a2 00 85 92 85 92 9c  86 58 96 3c 36 96 b3 9c  |.........X.<6...|
00000f80  96 28 22 96 36 34 96 46  43 96 c8 ca 96 4f 4c 96  |.(".64.FC....OL.|
00000f90  ac 9c 96 b9 9c 96 5b 58  96 1c 09 96 00 bf 96 3f  |......[X.......?|
00000fa0  36 96 2b 22 96 16 09 96  0c 09 96 84 96 96 84 99  |6.+"............|
00000fb0  99 03 52 78 66 86 85 86  95 96 09 5b 96 f1 bf 96  |..Rxf......[....|
00000fc0  5d 58 96 34 09 96 48 43  96 0f 09 96 39 36 96 ba  |]X.4..HC....96..|
00000fd0  9c 96 2e 22 96 4c 5d 96  ca 84 84 84 10 4e 53 57  |...".L]......NSW|
00000fe0  69 6e 64 6f 77 54 65 6d  70 6c 61 74 65 81 f8 01  |indowTemplate...|
00000ff0  94 84 0d 69 69 66 66 66  66 69 40 40 40 40 40 63  |...iiffffi@@@@@c|
00001000  0e 02 81 e9 01 81 5e 01  81 1c 02 81 bf 00 82 00  |......^.........|
00001010  00 78 30 84 99 99 08 41  72 63 68 49 6e 66 6f 86  |.x0....ArchInfo.|
00001020  84 99 99 08 4e 53 57 69  6e 64 6f 77 86 84 98 99  |....NSWindow....|
00001030  04 56 69 65 77 86 ca 85  01 84 04 66 66 66 66 00  |.View......ffff.|
00001040  00 81 a0 05 81 6e 03 b0  01 b5 81 1c 02 81 d5 00  |.....n..........|
00001050  92 85 b0 02 b5 83 ee ff  7f 7f 83 ee ff 7f 7f 86  |................|
00001060  96 52 4c 96 9c 57 96 ab  9c 96 b6 9c 96 84 96 96  |.RL..W..........|
00001070  84 99 99 08 41 72 63 68  49 6e 66 6f 86 85 86 95  |....ArchInfo....|
00001080  96 22 20 96 84 96 96 84  99 99 02 52 78 86 85 86  |." ........Rx...|
00001090  95 96 1f 09 96 64 61 96  5f 58 96 fb bf 96 19 09  |.....da._X......|
000010a0  96 ae ac 96 dd bf 96 54  4c 96 12 09 96 b2 9c 96  |.......TL.......|
000010b0  61 5f 96 25 22 96 31 22  96 41 09 96 6b 95 96 20  |a_.%".1".A..k.. |
000010c0  09 96 58 95 9a 13 96 c8  84 99 99 0d 4e 53 53 63  |..X.........NSSc|
000010d0  72 6f 6c 6c 56 69 65 77  31 86 96 64 84 98 99 00  |rollView1..d....|
000010e0  86 96 6b 84 99 99 01 57  86 96 3c 84 99 99 0b 4e  |..k....W..<....N|
000010f0  53 4d 65 6e 75 49 74 65  6d 31 86 96 4c 85 96 ba  |SMenuItem1..L...|
00001100  84 99 99 04 31 31 31 31  86 96 36 84 99 99 06 4e  |....1111..6....N|
00001110  53 4d 65 6e 75 86 96 58  84 99 99 04 4d 65 6e 75  |SMenu..X....Menu|
00001120  86 96 bf 84 99 99 0b 4e  53 54 61 62 6c 65 56 69  |.......NSTableVi|
00001130  65 77 86 96 39 84 99 99  0b 4e 53 4d 65 6e 75 49  |ew..9....NSMenuI|
00001140  74 65 6d 31 86 96 70 84  99 99 02 41 49 86 96 54  |tem1..p....AI..T|
00001150  75 96 72 84 99 99 02 52  78 86 96 61 84 98 99 01  |u.r....Rx..a....|
00001160  32 86 96 34 84 99 99 0b  4e 53 4d 65 6e 75 49 74  |2..4....NSMenuIt|
00001170  65 6d 31 86 96 95 84 98  99 0c 46 69 6c 65 27 73  |em1.......File's|
00001180  20 4f 77 6e 65 72 86 96  5f 84 98 99 01 31 86 96  | Owner.._....1..|
00001190  69 84 99 99 03 52 78 66  86 96 3f 84 99 99 0b 4e  |i....Rxf..?....N|
000011a0  53 4d 65 6e 75 49 74 65  6d 32 86 92 84 84 84 0c  |SMenuItem2......|
000011b0  4e 53 4d 75 74 61 62 6c  65 53 65 74 00 84 84 05  |NSMutableSet....|
000011c0  4e 53 53 65 74 00 94 84  01 49 01 92 6b 86 92 84  |NSSet....I..k...|
000011d0  a0 9a 1f 92 84 84 84 15  4e 53 4e 69 62 43 6f 6e  |........NSNibCon|
000011e0  74 72 6f 6c 43 6f 6e 6e  65 63 74 6f 72 81 cf 00  |trolConnector...|
000011f0  84 84 0e 4e 53 4e 69 62  43 6f 6e 6e 65 63 74 6f  |...NSNibConnecto|
00001200  72 11 94 b4 4f 85 84 98  99 13 70 65 72 66 6f 72  |r...O.....perfor|
00001210  6d 4d 69 6e 69 61 74 75  72 69 7a 65 3a 86 86 92  |mMiniaturize:...|
00001220  84 81 8a 00 b4 4b 85 84  98 99 0f 61 72 72 61 6e  |.....K.....arran|
00001230  67 65 49 6e 46 72 6f 6e  74 3a 86 86 92 84 81 8a  |geInFront:......|
00001240  00 b4 ba 95 84 98 99 0a  74 65 72 6d 69 6e 61 74  |........terminat|
00001250  65 3a 86 86 92 84 81 8a  00 b4 a2 95 84 98 99 1d  |e:..............|
00001260  6f 72 64 65 72 46 72 6f  6e 74 53 74 61 6e 64 61  |orderFrontStanda|
00001270  72 64 41 62 6f 75 74 50  61 6e 65 6c 3a 86 86 92  |rdAboutPanel:...|
00001280  84 81 8a 00 b4 b6 95 84  99 99 16 68 69 64 65 4f  |...........hideO|
00001290  74 68 65 72 41 70 70 6c  69 63 61 74 69 6f 6e 73  |therApplications|
000012a0  3a 86 86 92 84 81 8a 00  b4 b3 95 84 99 99 05 68  |:..............h|
000012b0  69 64 65 3a 86 86 92 84  81 8a 00 b4 9a 95 84 99  |ide:............|
000012c0  99 16 75 6e 68 69 64 65  41 6c 6c 41 70 70 6c 69  |..unhideAllAppli|
000012d0  63 61 74 69 6f 6e 73 3a  86 86 92 84 81 8a 00 b4  |cations:........|
000012e0  52 85 84 99 99 0c 70 65  72 66 6f 72 6d 5a 6f 6f  |R.....performZoo|
000012f0  6d 3a 86 86 92 84 81 8a  00 b4 0f 85 84 98 99 05  |m:..............|
00001300  72 65 64 6f 3a 86 86 92  84 81 8a 00 b4 46 85 84  |redo:........F..|
00001310  99 99 0e 73 74 61 72 74  53 70 65 61 6b 69 6e 67  |...startSpeaking|
00001320  3a 86 86 92 84 81 8a 00  b4 3c 85 84 98 99 0e 63  |:........<.....c|
00001330  68 65 63 6b 53 70 65 6c  6c 69 6e 67 3a 86 86 92  |heckSpelling:...|
00001340  84 81 8a 00 b4 16 85 84  98 99 05 63 6f 70 79 3a  |...........copy:|
00001350  86 86 92 84 81 8a 00 b4  3f 85 84 99 99 1e 74 6f  |........?.....to|
00001360  67 67 6c 65 43 6f 6e 74  69 6e 75 6f 75 73 53 70  |ggleContinuousSp|
00001370  65 6c 6c 43 68 65 63 6b  69 6e 67 3a 86 86 92 84  |ellChecking:....|
00001380  81 8a 00 b4 39 85 84 98  99 0f 73 68 6f 77 47 75  |....9.....showGu|
00001390  65 73 73 50 61 6e 65 6c  3a 86 86 92 84 81 8a 00  |essPanel:.......|
000013a0  b4 48 85 84 99 99 0d 73  74 6f 70 53 70 65 61 6b  |.H.....stopSpeak|
000013b0  69 6e 67 3a 86 86 92 84  81 8a 00 b4 19 85 84 98  |ing:............|
000013c0  99 06 70 61 73 74 65 3a  86 86 92 84 81 8a 00 b4  |..paste:........|
000013d0  08 85 84 99 99 07 64 65  6c 65 74 65 3a 86 86 92  |......delete:...|
000013e0  84 81 8a 00 b4 13 85 84  98 99 04 63 75 74 3a 86  |...........cut:.|
000013f0  86 92 84 81 8a 00 b4 1c  85 84 98 99 0a 73 65 6c  |.............sel|
00001400  65 63 74 41 6c 6c 3a 86  86 92 84 81 8a 00 b4 0c  |ectAll:.........|
00001410  85 84 98 99 05 75 6e 64  6f 3a 86 86 92 84 84 84  |.....undo:......|
00001420  14 4e 53 4e 69 62 4f 75  74 6c 65 74 43 6f 6e 6e  |.NSNibOutletConn|
00001430  65 63 74 6f 72 81 cf 00  81 8b 00 b4 70 6b 84 99  |ector.......pk..|
00001440  99 01 77 86 86 92 84 81  b4 00 b4 6b 70 84 99 99  |..w........kp...|
00001450  08 64 65 6c 65 67 61 74  65 86 86 92 84 81 b4 00  |.delegate.......|
00001460  b4 70 bf 84 99 99 02 74  76 86 86 92 84 81 b4 00  |.p.....tv.......|
00001470  b4 bf 70 84 99 99 0a 64  61 74 61 53 6f 75 72 63  |..p....dataSourc|
00001480  65 86 86 92 84 81 b4 00  b4 bf 70 84 99 99 08 64  |e.........p....d|
00001490  65 6c 65 67 61 74 65 86  86 92 84 81 8a 00 b4 2b  |elegate........+|
000014a0  69 84 99 99 02 64 3a 86  86 92 84 81 8a 00 b4 2e  |i....d:.........|
000014b0  69 84 99 99 02 65 3a 86  86 92 84 81 8a 00 b4 25  |i....e:........%|
000014c0  69 84 99 99 02 66 3a 86  86 92 84 81 8a 00 b4 28  |i....f:........(|
000014d0  69 84 99 99 02 67 3a 86  86 92 84 81 8a 00 b4 31  |i....g:........1|
000014e0  69 84 99 99 02 6a 3a 86  86 92 84 81 8a 00 b4 64  |i....j:........d|
000014f0  72 84 99 99 08 73 68 6f  77 48 65 6c 70 86 86 86  |r....showHelp...|
00001500  92 85 9a 5d 84 02 40 69  ca 02 cf 81 9d 00 81 ed  |...]..@i........|
00001510  00 cf ac 81 83 00 cf 81  a7 00 81 f2 00 cf 81 93  |................|
00001520  00 81 92 00 cf 58 1d cf  41 81 e6 00 cf 12 81 db  |.....X..A.......|
00001530  00 cf 19 81 e3 00 cf 81  bc 00 81 0b 01 cf 81 a9  |................|
00001540  00 81 f4 00 cf 09 81 d1  00 cf 5b 81 d0 00 cf 4f  |..........[....O|
00001550  17 cf 9a 81 96 00 cf 31  81 da 00 cf 81 8f 00 81  |.......1........|
00001560  8b 00 cf 81 ab 00 81 f5  00 cf 69 81 0c 01 cf 81  |..........i.....|
00001570  89 00 25 cf 22 81 d5 00  cf 1f 81 d2 00 cf 81 95  |..%."...........|
00001580  00 81 98 00 cf b2 81 90  00 cf 61 6a cf 81 be 00  |..........aj....|
00001590  81 0d 01 cf b6 81 91 00  cf fb 81 07 01 cf 70 81  |..............p.|
000015a0  ce 00 cf 2e 81 d9 00 cf  0f 81 d3 00 cf 4c 18 cf  |.............L..|
000015b0  f1 81 05 01 cf 16 81 e2  00 cf 57 38 cf 54 5c cf  |..........W8.T\.|
000015c0  ba 81 88 00 cf 72 81 cf  00 cf 48 81 e9 00 cf 81  |.....r....H.....|
000015d0  b6 00 81 ff 00 cf 1c 81  ea 00 cf 81 97 00 81 99  |................|
000015e0  00 cf 36 81 dd 00 cf 81  a5 00 81 f1 00 cf 43 81  |..6...........C.|
000015f0  e7 00 cf dd 81 04 01 cf  81 c0 00 81 0e 01 cf 81  |................|
00001600  91 00 81 8e 00 cf 5f 67  cf 5d 13 cf 34 81 dc 00  |......_g.]..4...|
00001610  cf 28 81 d7 00 cf 6b 15  cf 9c 39 cf c8 81 00 01  |.(....k...9.....|
00001620  cf 13 81 e1 00 cf ae 81  82 00 cf 81 c2 00 81 0f  |................|
00001630  01 cf 95 01 cf 81 b8 00  81 09 01 cf 2b 81 d8 00  |............+...|
00001640  cf 81 99 00 81 c6 00 cf  46 81 e8 00 cf 81 b1 00  |........F.......|
00001650  81 fa 00 cf 81 9f 00 81  ee 00 cf 81 c8 00 81 12  |................|
00001660  01 cf ab 81 c4 00 cf 81  ad 00 81 f6 00 cf 0c 81  |................|
00001670  eb 00 cf 81 b3 00 81 fe  00 cf 81 8d 00 27 cf f6  |.............'..|
00001680  81 06 01 cf 81 c4 00 81  10 01 cf 25 81 d6 00 cf  |...........%....|
00001690  08 81 e5 00 cf 20 81 d4  00 cf 81 af 00 81 f8 00  |..... ..........|
000016a0  cf 81 ba 00 81 0a 01 cf  39 81 de 00 cf 52 81 c5  |........9....R..|
000016b0  00 cf b9 81 95 00 cf 00  81 08 01 cf 3f 81 e0 00  |............?...|
000016c0  cf b3 81 86 00 cf bf 81  01 01 cf 3c 81 df 00 cf  |...........<....|
000016d0  81 a1 00 81 ef 00 cf 64  6f cf 81 9b 00 81 ec 00  |.......do.......|
000016e0  cf a2 3a cf 81 c6 00 81  11 01 cf 4b 05 cf 81 a3  |..:........K....|
000016f0  00 81 f0 00 9a 81 13 01  9a 01 96 bf c1 92 84 98  |................|
00001700  99 10 49 42 43 6f 63 6f  61 46 72 61 6d 65 77 6f  |..IBCocoaFramewo|
00001710  72 6b 86 86                                       |rk..            |

If you scroll through the dump you'll recognise a lot of things in there. How is your 'Apple' menu organised? It's in there. All the menu items are in there. You can see the classes used by the application. And so forth. But there's code in there too - and you're hardly going to make that out. This is the NIB file used by your application at runtime - this file and no other.

PkgInfo

PkgInfo is another file found in Cocoa bundles. It has eight bytes of data. That's it. And for those eight bytes you lose over four thousand. For every application on your hard drive.

What's in those eight bytes? They're a copy of what's already in the application's Info.plist.

<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleSignature</key>
<string>RxAi</string>

For 'ArchInfo' those eight bytes would be APPLRxAi. They're the creator code and file type used by legacy Carbon apps. Most Cocoa developers don't even bother specifying them at all.

PkgInfo is never needed to run any application on OS X; the dock needs it to identify the icons for Carbon applications; with Cocoa software PkgInfo is redundant. Try renaming one of your PkgInfo files to PkgInfo1 and then running your Cocoa app - did it still run? Of course it did.

TIFFs

'TIFF' is a graphic image file format. 'TIFF' stands for tagged image file format. You don't have to understand how the format is organised - you only have to understand that TIFF is a non-lossy format.

A non-lossy format (such as TIFF) is a format that doesn't lose detail. No matter what you do with an image the pixels you see are going to be the ones you see again when you've saved the file and later reopened it. Other formats such as JPEG are lossy: you lose detail each and every time you save.

But TIFFs don't work that way. They're non-lossy and no matter how many times you save you always see the same pixels every time. And wonder of wonders: TIFFs can be compressed just like JPEGs - but again: their compression is non-lossy. You never lose any detail.

'Buzz' Andersen is getting a lot of airplay. He used to work for Apple (which in itself is amazing) and he suffered from a life long dream of working for Apple (no comment) and he was hired by Apple for writing one application: PodWorks.

But as seen at the review URL referenced above dear old Buzz never really had a clue about software development on his employer's native platform: he's got a 32 pixel TIFF in there that sets a world record at 357,284 bytes - for a 32 pixel TIFF.

Go ahead and waste some bandwidth - download it now. All 357,284 bytes of it. And then get ready for the next part of the tutorial.

You can also click on its image below. [The image you see has already been fixed - it's only 1,629 bytes.]

  ← Click to Download

Debuzzification

It's time to cut this obscene file down to size. Drop to a Terminal.app command line wherever you downloaded the file [20071103,00,00.tiff] and type in the following commands. [Note this is all built into your system. Which means it was built into Buzz's system too.]

1. Just to verify how big this stupid monster is.

Type in the following. [And of course hit enter.]

ls -l

What you should get back is the following.

total 704
-rw-r--r--   1 501  501  357284 Nov  3 16:34 20071103,00,00.tiff

2. Now to squash it.

Type in the following. [And of course hit enter.]

tiffutil -lzw 20071103,00,00.tiff

What you should get back is the following.

1 image written to out.tiff.

3. Check the results of your handiwork.

tiffutil compressed your 'buzzer' - without losing any detail - and saved it to the file out.tiff. So now you check out.tiff - now you compare.

Type in the following. [And of course hit enter.]

ls -l

What you should get back is the following.

total 712
-rw-r--r--   1 501  501  357284 Nov  3 16:34 20071103,00,00.tiff
-rw-r--r--   1 501  501    2038 Nov  3 16:38 out.tiff

Oops! Hello! You mean the same file - the same image - comes up not at 357,284 bytes but at 2,038 bytes?

Back to your GUI. Open both files in Preview. Blow them up - 'zoom in'. Zoom in LOTS. See if you can see any difference whatsoever.




You can't. On screen they're 100% completely identical.

Framework Headers

Lots of nifty third party developers today use free ancillary frameworks for their software. Frameworks are the OS X Cocoa equivalent of shared libraries - independent code modules that get magically 'blended' with the application code at runtime.

There are a lot of them out there: Growl, Sparkle, Sprinkle, Burp, Belch - they all purport to add 'functionality' to your applications. They do things like make smoke appear to rise out of your window title bars and nag you to download updates.

For the developers to integrate these wonderful things into their applications they need the framework headers. Framework headers are files used during a build process - not at runtime. Here's the top level framework header for Cocoa itself.

/*
    Cocoa.h
    Cocoa Framework
    Copyright (c) 2000-2004, Apple Computer, Inc.
    All rights reserved.

    This file should be included by all Cocoa application source files for easy building. Using this file is preferred over importing individual files because it will use a precompiled version.

    Tools with no UI and no AppKit dependencies may prefer to include just <Foundation/Foundation.h>.
*/

#import <Foundation/Foundation.h>
#import <AppKit/AppKit.h>
#import <CoreData/CoreData.h>

Cocoa.h is only used at build time; it 'imports' definitions of the APIs (application programming interfaces) in the framework so the compiler and linker know what they're dealing with. After the application is built this information is no longer needed.

Now try telling that to the third party developers out there. Somewhere in the innards of most of these third party frameworks you're going to find a link to a directory called Headers - and you're going to find all those headers files in all their megabloat glory.

Need more convincing? Rename the directories. Change the Headers directory temporarily to Headers-temp and start your application again. Everything still work OK? Of course it does.

The Most Hated File on Earth

.DS_Store has been called 'the most hated file on earth' and the epithet is not without justification. What is it? It's a cache of Finder display settings for the current user. It has relevance at most for the current user. It has no relevance for anyone else.

Following its own weird logic .DS_Store should only be found in directories that are displayed. But the innards of your Cocoa bundles are not meant to be displayed - so why do you find files like this buried within? There's only one possible answer: the people that packaged your software don't have a clue.

Finder is OK for ordinary users (maybe) but if this is all a developer uses then go elsewhere for your third party products. Find .DS_Store files in your shiny new third party applications? Your developer friends didn't have a clue. If they're that sloppy then what did they do to the application code?

OK then - now here's the real no brainer: have you ever seen Apple dump a .DS_Store in one of their Cocoa applications?

Think about it.

Why Do They Do It?

With such daunting evidence you're bound to wonder: if this stuff is all junk and nothing but junk why are we sent to download this junk and keep it on our disks?

Good question - next question! There are many theories, many possibilities. Here the most obvious two.

  1. These third party 'developers' are not 'pros' - and they're just too stupid.
  2. They're not entirely stupid but they don't give a damn and they're sure you're stupid.

But at the end of the day it's not interesting why they do what they do. What's interesting is that Apple have never done things this way. What's further interesting is that you don't have to stand for this nonsense either.

Check the following section if you don't know where this is leading.

See Also
Trimmit vs Xslimmer
Vacuous Virtuoso: trim-app
The Good: Trimmit — Give a Damn
Vacuous Virtuoso: Download Trimmit!
Industry Watch: Trimmit — Cheap 'n' Easy
Vacuous Virtuoso: Mac developer? Clean up your app
Developers Workshop: Building and Packaging Native OS X Applications

About | Buy | Forum | Industry Watch | Learning Curve | Products | Search | Twitter | Xnews
Copyright © Rixstep. All rights reserved.