Saturday, December 18, 2010

How to fix Xcode build error 'Directroy "/XYX/" following -F not found'

I started working on iTimeZone HD, the iPad release, for real today and something pretty weird happened.

I created a new target as a stand alone iPad application based on my current iTimeZone iPhone target. Once I built, first thing I see is this message:

warning: directory '"Macintosh HD/Users/YourName/Code/Project"' following -F not found

This doesn't happen on the iPhone target, and it took me a while to figure out what was going on. Here's what you do to get rid of this annoying message:

  1. Get Info on your Target (e.g. iTimeZone HD)
  2. Click on the Build tab
  3. In the Configuration drop down, select All Configurations
  4. In the search box enter Framework
  5. You should see Framework Search Paths in the results. Click on it.
  6. Press delete
  7. Close the info window and rebuild

You're warning should now be gone.

Saturday, December 04, 2010

Best Way to Implement Private Methods in Objective-C

Since the iPhone SDK came out, I've been using the following syntax in my Objective-C implementation file (the .m) to implement private methods:

@interface ClassName (Private) - (void)privateMethod; @end

@implementation ClassName - (void)privateMethod { //keep this private }

This style just creates a Category for your class that's not in the header, so other classes can't read it. Turns out there was an even better way introduced in the Objective-C 2.0 spec using Extensions, which are like anonymous categories, but the improvement is the implementation must exist in the main implementation block for the class. Here's the example re-written:

@interface ClassName () - (void)privateMethod; @end

@implementation ClassName - (void)privateMethod { //keep this private } @end

Not much has changed, instead of decorating your category with a name, (Private), you just put empty parenthesis, ().

Once I switched over the iTimeZone code base, realized I was carrying some dead weight method declarations, so win!

Here's Apple's documentation.

Check out bbum's comment for additional syntactical sweetness to make private/public properties with property redeclaration.