• 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: Getting list of classes
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Getting list of classes


  • Subject: Re: Getting list of classes
  • From: Bill Bumgarner <email@hidden>
  • Date: Tue, 15 Jan 2002 23:01:35 -0500

(The source to class-dump isn't going to help for *in runtime* introspection; it works by ripping apart the mach-o segments and dumping the ObjC stuff. Certainly, could be done from within the running app to itself, but that won't truly tell you what is going on at the runtime. The runtime is dynamic and there are many more classes than just those immediately present within your mach-o.)

Some other tips before buggering the runtime....

- method swizzling is a beautiful and dangerous thing. See the source to PBXNoSlideHack and SSHPassKey (the PBX bundle) for examples of swizzling (swapping one method's IMP for another). It can be dangerous in that you can easily hose the app by making assumptions that just ain't true. (Also,
it is particularly confusing to implement a method and have to remember that self in the body of the implementation does not actually point to an instance of the class you implemented the method in...)

- When working at the objc_*() API level, you are far better off treating everything as pointers to C structures. Instead of converting a Class to a string (NSStringFromClass() or via "%@"), use %s and the isa->name. In general, the fewer objects you create or message when down in the bowels of the runtime, the better off you will be.

- As John indicates, certain classes do not behave like NSObject. I would state a bit more strongly; certain classes do not want to be touched, ever, outside of the context they are implemented to be used within. NSProxy is an example; any attempt to message the class directly will generally yield an exception. Faults are another. There are a handful of others. They will make themselves abundantly apparent when you run into them.

- Transparent bridging between ObjC and CoreFoundation makes things tricky.
I.e. sometimes an NSString or NSBundle is not really a Foundation object,
but is a CFStringRef or CFBundleRef that can be transparently messaged, but doesn't behave *quite* like an ObjC object when you start doing weird things to it.

- There used to be some bugs in the AppKit related to class initialization order. That is, if you walked down the list of classes as returned by objc_getClasses() and messaged each class, you would cause the +initialize to be called. Certain classes (Font related, if I remember correctly) didn't like to be initialized before others. These were mostly fixed, at one point, but there have been numerous changes since OpenStep 4.2 and there may be new ones.

- You can programmatically create new classes without much difficulty (outside of remembering all that 200 level C pointer stuff), register them with the runtime, and use them like any other ObjC class. This is how various intra-language bridges often work.

The bottom line is this: If you stick to the APIs as perpetuated by NSObject for performing introspection, the runtime will generally behave in a clean and controlled fashion as any good dynamic runtime should (i.e.
think SmallTalk, Python, Common Lisp). However, when you dive into the depths and drop down to the objc_*() functional API for manipulating the runtime directly, you are going to run into a number of optimizations or other bits of magic that behave much more like a highly optimized ANSI C based implementation (i.e. confusing) than like a well disciplined, totally consistent, runtime.

This is not a criticism-- the optimizations and other hackery are there to make programming against the pure object APIs that much more enjoyable / flexible / effective. And they generally do and do so in a relatively efficient fashion in comparison to other runtimes and without sacrificing too much in the way of flexibility.

b.bum

On Tuesday, January 15, 2002, at 08:58 PM, cocoa-dev-
email@hidden wrote:

Take a look at /usr/include/objc/objc-runtime.h. (objc_getClassList)

Note that not everything that is a class has to behave like NSObject or
Object; be careful to check that the class is something you know how to
handle before you start sending messages to it.

b.bum
I ride tandem with the random....
.... things don't happen the way I planned them.


  • Prev by Date: KEXT File System Plugins?
  • Next by Date: Converting View Coordinates
  • Previous by thread: Re: Getting list of classes
  • Next by thread: Power management API
  • Index(es):
    • Date
    • Thread