Q:

How can I programmatically determine if my app is running in the iphone simulator? 

As the question states, I would mainly like to know whether or not my code is running in the simulator, but would also be interested in knowing the specific iphone version that is running or being simulated. 
EDIT: I added the word 'programmatically' to the question name.  The point of my question is to be able to dynamically include / exclude code depending on which version / simulator is running, so I'd really be looking for something like a pre-processor directive that can provide me this info. 

A:

Already asked, but with a very different title. 
What #defines are set up by Xcode when compiling for iPhone
I'll repeat my answer from there:
It's in the SDK docs under "Compiling source code conditionally"
The relevant definition is TARGET_OS_SIMULATOR, which is defined in /usr/include/TargetConditionals.h within the iOS framework.  On earlier versions of the toolchain, you had to write:
#include "TargetConditionals.h"

but this is no longer necessary on the current (Xcode 6/iOS8) toolchain. 
So, for example, if you want to check that you are running on device, you should do
#if TARGET_OS_SIMULATOR
    // Simulator-specific code
#else
    // Device-specific code
#endif

depending on which is appropriate for your use-case. 

A:

Updated code:
This is purported to work officially. 
#if TARGET_IPHONE_SIMULATOR
NSString *hello = @"Hello, iPhone simulator!"; 
#elif TARGET_OS_IPHONE
NSString *hello = @"Hello, device!"; 
#else
NSString *hello = @"Hello, unknown target!"; 
#endif

Original post (since deprecated)
This code will tell you if you are running in a simulator. 
#ifdef __i386__
NSLog(@"Running in the simulator");
#else
NSLog(@"Running on a device");
#endif

A:

Not pre-processor directive, but this was what I was looking for when i came to this question;
NSString *model = [[UIDevice currentDevice] model];
if ([model isEqualToString:@"iPhone Simulator"]) {
    //device is simulator
}

