Think of a variable like a box with a name, that you can put stuff in. If you have an int, it'll go in the box. If you have a float, it'll go in the box. If you have an object, it's too big to go in the box, so at lives in a big heap of other objects at number 17 Kehuia Road. Its address goes in the box, so you know where to find the object. The address is called a pointer to the object, because it points out where the object is.
This means that if you have two different variables (boxes) and each has the number 3 in it, you have two different 3s. If you have two different variables each of which has the address 17 Kehuia Road in it, you still only have one object.
Objects in Objective C are always referred to via pointers.
If you have a declaration like NSString* name; that means that name is a box which can hold the address of an NSString object.
The type before the function's name is the type of value that function returns. sin returns a double, for example, and lots of functions return nothing at all (void). main returns an int, which is the exit status of your program. Typically you'll return zero (EXIT_SUCCESS) or one (EXIT_FAILURE).
If your program is run from the command-line, the user can type more things on the command-line after your program's name. The number of things they type comes into main as argc "argument count", the actual things they type come in as zero-terminated C strings into the array argv "argument values". Cocoa's NSApplicationMain handles the arguments for you, so you typically don't have to worry about them in Cocoa.
ProjectName_Prefix.h is a header file which is automatically included at the top of every file in your project. It gets precompiled, which means that files that include it can compile quicker. You'll typically just #import framework headers into your prefix header. It's not crucial, if it's causing problems you can delete it and remove it from the target settings.
# signifies a preprocessor command. C-family languages get compiled in two stages. First the preprocessor runs over the source file doing essentially find-and-replace and copy-and-paste, then that transformed source file is sent to the compiler.
#ifdef means "if defined". __OBJC__ is a preprocessor symbol defined by the compiler whenever it's compiling an Objective C source file.
#import means "if you haven't already, find this file and copy and paste the contents here", so #import <Cocoa/Cocoa.h> will get replaced by the entire contents of /System/Library/Frameworks/Cocoa.framework/Headers/Cocoa.h, which in turn #imports a bunch more files...
enum declares a bunch of integer constants. So if I write
It basically says that I can type MOVE_LEFT instead of zero, MOVE_RIGHT instead of one, &c. It's really just a way to give integer constants meaningful names.
I started by learning Java. It doesn't have a preprocessor or enums, but it does have pointers (though no *s), function return types, and command-line arguments passed to main...