Search code examples
iphoneobjective-cxcodemethodsipod

Frustrated with Objective-c code


Well, I've started with iPod/iPhone programming using Head First iPhone Development (O'reilly) and I'm typing code out of the book. There are two problems, one is programming related and the other is not.

  • I don't understand the format of objective-c methods. I'm getting an few errors now, based on source code from the book. Which leads me to my next issue.

  • Some of the code is buggy. I think so because I couldn't get the code to run without modifying it. The book has some typos in the text since it's a first edition and whatnot, but could my "fixing" the code have to do with it?

So... Where can I learn more about objective-c methods and how they work in terms of structure and where the return type and arguments go?

For those with the book, I'm in the middle of the InstaTweet app towards the beginning.

Thanks.


Solution

  • Maybe a comparison between a "c-like" language and obj-c would be useful -- let's go with Java. Imagine a Rectangle class with a setBackgroundColor method. We'll assume we have an instance of Rectangle called rect.

    In Java, the method signature would likely be

    public void setBackgroundColor(int r, int g, int b) { ... }
    

    In Objective-C, arguments are part of the method signature, so it might be

    - (void)setBackgroundColorWithRed:(int)r green:(int)g blue:(int)b;
    

    The "-" means it's an instance method on the Rectangle class. (void) is the method's return type. Then come the arguments. Each colon defines an argument, which is typed (each arg is (int) in this example).

    Let's compare calling these methods. Java:

    rect.setBackgroundColor(255, 255, 0);
    

    Obj-c:

    [rect setBackgroundColorWithRed:255 green:255 blue:0];
    

    A lot of people stumble on obj-c's syntax -- you're not alone. Hopefully this comparison will make things clearer. It also exemplifies a linguistic strength of objective-c: at call time, it's clear what your arguments are. If I were reading code and saw the Java method being called, it wouldn't be obvious that the arguments are red, blue, and green. In obj-c, it's painfully clear that we're setting individual color values. Granted, most developers can guess what the three arguments to a setColor method are, but more complex methods get confusing. Here is a more complex method defined in Java and objective-c:

    static Dog createDog(  String name
                         , int age
                         , boolean isNeutered
                         , String ownerName
                        );
    + (Dog *)createDogNamed:(NSString *)name 
         age:     (int)        age 
         neutered:(BOOL)       isNeutered 
         owner:   (NSString *) owner;
    

    At call time:

    Dog.createDog("Fluffy", 2, true, "Moshe");
    [Dog createDogNamed:@"Fluffy" age:2 neutered:YES owner:@"Moshe"];
    

    Objective-c is more verbose, but much more readable. In the Java example, it's not really clear what the "2" and "true" arguments mean. Objective-c almost reads like English.

    Other people have posted links to more in-depth guides, but I hope this gets you past the syntactic stumbling blocks enough to make the links useful. I'm happy to answer more specific questions you have. In my experience, obj-c newbies have a really tough time with syntax, and then it clicks and feels brilliant. Hang in there!