• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Where/when to #import
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Where/when to #import


  • Subject: Re: Where/when to #import
  • From: Jonathon Mah <email@hidden>
  • Date: Wed, 10 Oct 2007 03:13:34 +0930

Hi Paul,

On 2007-10-10, at 00:55, Kai BrĂ¼ning wrote:

There are actually two reasons I know about why you may want to use @class (that is, a forward declaration) instead of #import if possible:

- To avoid circular references (as Etienne points out in his answer), which is a rare problem.

Indeed. The whole point of using #import instead of #include is to have the compiler avoid circular references automatically. It does this by not re-including a file if another of that name has already been imported.


You can still get duplicate imports if, for example, you have a structure like:

// ClassA.h
#import "other/ClassB.h"
#import "ClassC.h"

// ClassC.h
#import "ClassB.h"

Since it only works on the path level, ClassB.h would be included twice (which would likely lead to errors).

But in more recent versions of Xcode, this is mostly a moot point, since you don't usually have to specify a path to a file -- Xcode will put all the directories containing headers on the include path automatically.

- To minimize imports in headers in order to speed up compiles.

This is the real reason you'd want to use @class instead of #include.

If I may tweak Nelson's rules:

1. Generally, #import <Cocoa/Cocoa.h> in your class interface files. For model classes that you might want to use in non-GUI situations (e.g. Spotlight importer), you can instead just #import <Foundation/ Foundation.h>.

(Importing Cocoa.h is shorthand for importing Foundation+AppKit +CoreData.)


2. If your class interface refers to other classes that aren't in the frameworks (such as in instance variables, or method parameters and return types), forward-declare those classes with @class.



3. If your class is a subclass of a non-framework class, you must #import the superclass's header.



4. In your implementation file, #import the interface, and #import the interfaces of any other classes whose methods you call.



The situation you want to avoid is this. Say you have a class that is used by many other source files in your program (CommonClass), and its interface #imports a little helper class (HelperClass). If you tweak HelperClass.h (re-order instance variables, or even just add a comment), then that will flow on to CommonClass.h, which will then flow on to the hundreds of other files that include the common class (making the build take a long time). Instead, the /implementation/ CommonClass.m should #import HelperClass.h, and CommonClass.h should just @class HelperClass.



And I've written a bit too much now.



Jonathon Mah
email@hidden


_______________________________________________

Cocoa-dev mailing list (email@hidden)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden


  • Follow-Ups:
    • Re: Where/when to #import
      • From: Tim Davis <email@hidden>
References: 
 >Where/when to #import (From: Paul Bruneau <email@hidden>)
 >Re: Where/when to #import (From: Kai BrĂ¼ning <email@hidden>)

  • Prev by Date: Re: Where/when to #import
  • Next by Date: Re: multicasting and distributed objects
  • Previous by thread: Re: Where/when to #import
  • Next by thread: Re: Where/when to #import
  • Index(es):
    • Date
    • Thread