Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Objective-C Clarification; -/+ and *var

Tags:

objective-c

I'm teaching myself Objective-C from a book (Cocoa programming for mac OS X) and am about halfway through however I have two questions that aren't answered or defined in the book.

  1. When defining class methods what is the difference between (assuming there in a .h file):

    - (int) population;

    + (int) population;

The way I see it at the moment is that - methods require the class to be allocated and initialized first however + can be called statically without requiring allocation and initialization. E.g. (in a function in another class)

// Using -
Earth *world = [[Earth alloc] init];
int population = [world population];

// Using +
int population = [Earth population];

If that is correct, when should I use static methods and are they're any disadvantages with doing so.

  1. When defining a var in either a function paramater or as an actual var in a function, does the use of * mean the var will be an object? e.g. (again in a header file.)

    - (void) setPopulation: (NSNumber *) population; //Use of * as population is of NSNumber

    - (void) setPopulation: (int) population; // population isn't a class so doesn't need *

Sorry if any of my terms don't make sense in the land of Objective-C such as static methods, etc. I'm a PHP and Ruby Programmer.

like image 793
stuartloxton Avatar asked Jan 02 '09 12:01

stuartloxton


1 Answers

The -/+ in method declarations for Objective-C simply denote whether the method is a class method or an instance method. For example, with Objective-C, you cannot send an instance a message that was declared as a class method. For example:

@interface MyObject : NSObject
-(void)myInstanceMethod;
+(void)myClassMethod;
@end

// ...

MyObject* obj = [[MyObject alloc] init];

[obj myInstanceMethod];      // this is okay
[obj myClassMethod];         // this will fail
[[obj class] myClassMethod]; // this is okay
[MyObject myClassMethod];    // this is okay
[MyObject myInstanceMethod]; // this will fail

As to the second part of your question, Objective-C is a strict super-set of C. It adds classes but they are really C data structures whose implementations are hidden from you by the Objective-C runtime. Because of this, classes are always represented as pointers. In C, the * means that the variable is being declared as a pointer to some memory address. You can use pointers with primitive types in C as well, but Objective-C objects must always be referred to by pointers.

There are many great tutorials/introductions to pointers out there. I would suggest simply googling for C tutorial and pointers to learn more.

like image 171
Jason Coco Avatar answered Oct 05 '22 11:10

Jason Coco