Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Want to learn Objective-C but syntax is very confusing

Tags:

Coming from Java background I am guessing this is expected. I would really love to learn Objective-C and start developing Mac apps, but the syntax is just killing me.

For example:

-(void) setNumerator: (int) n {     numerator = n; } 

What is that dash for and why is followed by void in parenthesis? I've never seen void in parenthesis in C/C++, Java or C#. Why don't we have a semicolon after (int) n? But we do have it here:

-(void) setNumerator: (int) n; 

And what's with this alloc, init, release process?

myFraction = [Fraction alloc];  myFraction = [myFraction init]; [myFraction release]; 

And why is it [myFraction release]; and not myFraction = [myFraction release]; ?

And lastly what's with the @ signs and what's this implementation equivalent in Java?

@implementation Fraction  @end 

I am currently reading Programming in Objective C 2.0 and it's just so frustrating learning this new syntax for someone in Java background.

UPDATE 1: After reading all these answers and Programming in Objective C 2.0 a little further, it's all starting to make sense now!

UPDATE 2: Thanks for the great tip "support-multilanguage". We can combine these two statements into one like so:

myFraction = [Fraction alloc];  myFraction = [myFraction init]; 

Can be reduced to:

myFraction = [[Fraction alloc] init];  
like image 953
Sahat Yalkabov Avatar asked Jun 10 '10 00:06

Sahat Yalkabov


People also ask

Why is Objective-C so hard?

The language is a strict superset of C, which is kind of cool, except in some ways it's holding the language back when compared to other modern languages. Being a superset of C adds a lot of cruft which, we'll see shortly, compounds a problem with complexity of Objective-C. Objective-C is a large language.

Do I need learn C before Objective-C?

It's a good idea to learn C before learning Objective-C, which is a strict superset of C. This means that Objective-C can support all normal C code, so the code common to C programs is bound to show up even in Objective-C code.

Is Objective-C harder than C++?

You can achieve essentially the same things in either language, but in my opinion the C++ syntax is simpler while some of Objective-C's features make certain tasks (such as GUI design) easier thanks to dynamic dispatch.

Is Objective-C as fast as C?

The difference between C and Objective C is speed. But this call needs to perform a dynamic look-up in a method table and that every time the method is called. C on the other hand does static dispatch. Static dispatch is much faster.


2 Answers

What is that dash for and why is followed by void in parenthesis?

The dash - means "instance level" ( which is the default in Java ). When you see a plus sign + it means class level ( same as using static in Java )

The void in parenthesis is the return type see below.

Why don't we have a semicolon after (int) n? But we do have it here:

-(void) setNumerator: (int) n; 

Because that's the method signature, you can think of it as a interface:

 interface YourClass {       void setNumerator(int n );// see? semicolon  } 

Same situation.

Objective-C having roots in C ( actually this is the real C with objects ) needs a header file ( completely removed in Java ) where you define what the functions/methods your class would have.

The equivalent if such thing would exist in java would be:

// YourClass.java.h    interface YourClass {       void setNumerator(int n );  }  // YourClass.java.m  class YourClass {       void setNumerator( int n ) {        this.n = n;       }   } 

And what's with this alloc, init, release process?

myFraction = [Fraction alloc];  myFraction = [myFraction init]; [myFraction release]; 

allo-init is the equivalent for new in Java, alloc that's when you ask for memory for your object, alloc request memory, and init calls the init method, equivalent to the Java class constructor ( btw Ruby does the same behind scenes )

There's no equivalent to release in Java because it is garbage collected, in Objective-C you have to release your object.

BTW, the initialization could also be myFraction = [[Fraction alloc]init];

And lastly what's with the @ signs and what's this implementation equivalent in Java?

 @implementation Fraction   @end 

That's the class definition as I mentioned earlier.

I am currently reading Programming in Objective C 2.0 and it's just so frustrating learning this new syntax for someone in Java background.

Here's a related answer that will help you to get more familiar with the square brackets:

Brief history of the "square brackets" is I remember it.

like image 166
OscarRyz Avatar answered Oct 08 '22 00:10

OscarRyz


Perhaps have a wizz through the wiki page for Objective-C. I just did and found most of your answers.

http://en.wikipedia.org/wiki/Objective-C

I'm from a java background too, on first look objectivec doesn't look too sexy.

It looks like C++ with little bits of syntax on it's face.

What is that dash for and why is followed by void in parenthesis?

minus here denotes an instance method, a plus denotes a class method

I've never seen void in parenthesis in C/C++, Java or C#.

this is the return type

Why don't we have a semicolon after (int) n?

If you don't provide a method body then the syntax is a method declaration - not an implementation.

And lastly what's with the @ signs and what's this implementation equivalent in Java?

@implementation Fraction  @end 

in java would probably be

public class Fraction {  } 
like image 41
chickeninabiscuit Avatar answered Oct 08 '22 00:10

chickeninabiscuit