AppKiDo version history

Version 0.997 (August 26, 2013)

  • Now able to load the most recent docsets from Apple, including Xcode 5 docsets. (Gory details: there is now an extra <h1> tag in HTML files containing class docs, which was throwing off my parsing logic.)
  • Fixed a problem that was causing launch to fail for users whose bash initialization generates any output. (Gory details: I had an NSTask running xcode-select via bash. There was a reason for this, but not a very good one. Now the NSTask runs xcode-select directly.)
  • On launch, now detects immediately when the user hasn't downloaded the docset, instead of first parsing a bunch of files, which was a waste of time. (Gory details: my sanity check is to look for the local HTML file containing NSObject documentation. If it's not there, the docset needs to be downloaded.)
  • Added missing source files (AKBehaviorGeneralDoc.[hm]) whose absence broke the build. (Gory details: the build did not break for me because the Xcode project was pointing to files that are present on my machine, but in the wrong directory. When I used a clean checkout to do the build I saw the same problem as others did.)

Version 0.996 (April 5, 2013)

There was, briefly, a version 0.995 that a few people tested privately. I've made a bunch of changes since then; I hope I didn't break anything.

System requirements

  • AppKiDo 0.996 requires OS X 10.6 (Snow Leopard) or higher. 10.5 is no longer supported.

Features and feature improvements

  • "Pop Quiz" feature. Just for grins. Hit Go > Pop Quiz (Control-Command-P) and you're presented with a random API symbol. You can quiz yourself on what the symbol is before proceeding to see the docs for it.
  • The "Window classes" and "Cell classes" quicklists don't make sense for iOS. AppKiDo-for-iPhone now lists "View controller classes" and "Layer classes" instead.
  • Added NSHashTable, NSMapTable, and NSPointerArray to the "Strings, data collections" quicklist.
  • Doing a search for "setFoo" now searches for properties named "foo" as well as any symbol containing "setfoo" (inspired by the same feature in Xcode and Dash).
  • Added a "Header File" menu item, with Shift-Command-H as the shortcut.
  • The standard Option-Command-H shortcut is now assigned to "Hide Others".
  • Added Option-Command-T keyboard shortcut for toggling the toolbar.
  • Added Copy, Copy File Path, and Speech to the contextual menu in the doc view.

Appearance and layout

  • The two views in the middle section -- the "subtopic list" and the "doc list" -- are now in a split view so you can adjust their relative widths. The widths are remembered when the window is restored on relaunch and when you use the "Remember This Window's Layout" feature.
  • More sensible split view resizing when you resize the window and when you collapse/expand the topic browser. Only the bottom section (the "doc view") resizes, instead of all three sections (top, middle, bottom).
  • Thin splitters in the split views. A little harder to hit with the mouse, but looks nicer.
  • Made the default drawer size wider.
  • Focus ring appearance. Solid blue border around the browser, around each list, and around the web/text view. (Other items such as buttons use the standard Cocoa focus ring.)
  • Focus ring behavior. Tab/Shift-Tab cycles through views in the drawer as well as the main window, and it includes the topic browser as it makes the rounds.
  • Changed the look of the small navigation buttons below the topic browser (they're now black triangles with no borders), and the button in the quicklist drawer for deleting the selected Favorite (it's now a lighter "x" with no border). The popup menus for the navigation buttons now use small fonts.


  • After a search, we now select the first search result with the search string as a prefix. (Example: search for "query" and -[NSURL query] should be selected.) This is an old feature that was broken for a while.
  • Fixed two bugs in the "method-aware search" service: failure to parse unary method name ("[self foo]"), and getting confused by leading comments ("/* foo */ [self foo:bar]").
  • Fixed bug where secondary frameworks weren't showing up in the Overview doc list (e.g., NSString > "AppKit Additions" wasn't showing up).
  • Fixed bug causing ApplicationServices > Types & Constants > Constants > "Color Modes" to appear twice as the same doc instead of two different docs. It now appears as "Color Modes (Core Printing)" and "Color Modes (QuickTime Constances)".
  • Fixed a bug causing AppKiDo-for-iPhone to think UIKit rather than Foundation is the owning framework for NSObject. As a result, when you selected NSObject, the displayed description was "UIKit class" rather than "Foundation class". If you then selected the "General" subtopic you'd see "Overview" and "Overview [Foundation Additions]" when it should have been "Overview" and "Overview [UIKit Additions]".
  • Slight correction to what is displayed in the "Add X to Favorites" menu item. It now matches what gets displayed in the Quicklist -- e.g., "AppKit Functions", not just "Functions".
  • Fixed a quirk: if you select text in the web view and do "Use Selection for Find" (Command-E), we were momentarily focusing the quicklist search field, thus removing focus from the web view, which caused "Find Next" (Command-G) to start from the beginning of the web view instead of from where you were.
  • Fixed the autoenabling and actions of the "General", "Properties", "ALL Properties", etc. menu items.
  • When the subtopic list navigates, it now scrolls if necessary to reveal the newly selected subtopic. Example: do a search for "clip", and in the search results select CGContextClip; the subtopics list autoscrolls to make "CGContextClip" visible.

Code cleanup and modernization

Sweeping code changes. They don't affect the app's functionality, but if you care about the underlying code you might want to know about them.
  • Replaced NSEnumeration with fast enumeration everywhere. Doesn't make any difference to the user, but it makes the code seem less ancient.
  • Replaced deprecated method calls with their recommended replacements.
  • Replaced most of my hand-rolled view controllers and window controllers with NSViewControllers and NSWindowControllers.
  • Tabless NSTabView for the doc view. One tab for the web view used to display docs, one for the text view used to display headers. This replaces the hand-coded view swapping I was doing (not sure why, since it looks like tabless tabviews have always been supported). Also replaces programmatically creating the WebView, which was left over from back when WebKit was not necessarily present on the user's machine.
  • Got rid of the AKFramework class. A string containing the framework name is used to indicate membership in a framework.
  • Coding conventions.
    • Now using Xcode's built-in reformatting, so for example multi-line method names align on colons.
    • Replaced hand-coded accessors with properties (although still declaring ivars in the @interface to be 32-bit compatible).
    • Using the new @-literals (although not square-bracket collection indexing, because it's not supported in 10.6).
    • Simplified class and method comments. Got rid of HeaderDoc tags (@description, @param, etc.). Haven't made these changes to all the source files yet, but many.

Version 0.994 (February 17, 2013)

  • (Thanks to Peter Hosey.) In the Dev Tools prefs you now indicate where is, and AppKiDo figures out which type of Xcode you have -- whether it's a standalone Xcode with all the Dev Tools inside it, or the old-style Dev Tools where Xcode is in /Developer/Applications.
  • Improved handling and reporting of errors that arise from Dev Tools setup.
  • Added a sanity check for whether the docset needs to be downloaded. If so, an alert appears explaining this fact, and then you get the Dev Tools setup window where you can try selecting a different Xcode installation or a different SDK version. This should reduce the occurrences where AppKiDo launches and the windows don't have any docs in them.
  • Dropped support for very old Dev Tools installations that don't use docsets. I'm not sure AppKiDo can even run on systems that old any more.
  • Splash window no longer ties up main thread -- for example you can Quit or Hide Others while it's displaying. Makes accidental launch a bit less annoying.
  • Edited the credits in the About box.
  • A little thing -- the About box uses a WebView, which by default has elasticity when you use the trackpad to scroll. Removed that elasticity.
  • (In case you're wondering, there *was* an 0.993, but I forgot to code-sign it. Many thanks to Rainer Brockerhoff for catching this quickly and for his extremely helpful validation app, RB App Checker Lite.)

Version 0.992 (July 25, 2012)

  • Codesigned, so you can run AppKiDo on Mountain Lion with Gatekeeper in "Mac App Store and identified developers" mode.
  • Known issue: If you select the 10.8 SDK AppKiDo won't find any docs, because Xcode doesn't (yet) download them locally. You can browse classes, methods, etc., but the doc text pane will be empty.

Version 0.991 (July 24, 2012)

  • Added a system service: "Look Up in AppKiDo". (In AppKiDo-for-iPhone it's "Look Up in AppKiDo-for-iPhone".) See the note below this list for details.
  • Added a preference for whether a search request via AppleScript or system services opens a new window. Defaults to NO. Previously, a search via AppleScript would always open a new window.
  • Fixed a bug causing a lot of constants (e.g. NSCocoaErrorDomain) not to appear.
  • I'm starting to use fast enumeration in the code, which means AppKiDo now requires at least 10.5 (Leopard). I've updated the system requirements on the home page accordingly.
  • "Check for Newer Version" now connects to, the new home for AppKiDo now that MobileMe has been shut down.
  • "Check for Newer Version" should now work for AppKiDo-for-iPhone. It was broken even before MobileMe was turned off, because a file was missing on the web site.
  • Links in the About box now connect to
  • Fixed the AppKiDo-for-iPhone icon so it displays properly on Retina displays. (Only AppKiDo-for-iPhone had this problem.)

About "Look Up in AppKiDo"

"Look Up in AppKiDo" is a service that you can invoke from any application where you have selected some text. It activates AppKiDo and performs a search for that text.

Often what we want to search for is a method name. AppKiDo tries to help by determining whether the selected text contains an Objective-C message-send or method declaration. If so, it searches for that method name. Otherwise, it searches for the literal text you have selected.

For example, in Xcode if you have [self flyToX:100 y:200 z:300], you can double-click one of the square brackets to select the whole expression, then invoke this service. AppKiDo will search for the method name flyToX:y:z:.

If you happen to be in BBEdit, where double-clicking a bracket selects the text inside the brackets, the service should still work. If there is leading whitespace or a cast, or newlines or comments anywhere, it should still work, so if you have lines like this you can select them all and then invoke the service:

    (void)[self flyToX:100  // cast to void to discard the return value
                     z:900 /*300*/];

Note that "Look Up in AppKiDo" doesn't work if there is an assignment in the selected text. For example, it won't work if you select this whole line:

    BOOL didFly = [self flyToX:100 y:200 z:300];

The workaround is to select just the message-send -- the part after the "=".

Another intended use is when you're looking at code that declares a method and you want to search for that method name. For example, you can select these lines and it will search for browser:child:ofItem: (the "-(id)" will be ignored):

    - (id)browser:(NSBrowser *)browser

This service assumes well-formed Objective-C. You might get unexpected results otherwise. If there are nested messages, it uses the top-level one. The algorithm mainly looks at punctuation -- delimiters like brackets and a few other characters that need special treatment. The basic idea is that it ignores anything between delimiters, like (blah blah blah), [blah blah blah], or {blah blah blah}. For this reason it should work if your selected code contains blocks or the new object literals.

If you use the "Look Up" service, remember to assign a hotkey in System Preferences > Keyboard > Keyboard Shortcuts > Services for maximum convenience.

[ older release notes ]