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.

Get 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. classes.nib info.nib objects.nib or keyedobjects.nib 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.

: this tells Interface Builder where to put its main window on screen when it opens this NIB. IBEditorPositions : same thing.

: 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.. 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. These third party 'developers' are not 'pros' - and they're just too stupid. 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