对Objective-c代码感到沮丧

时间:2010-03-12 04:49:34

标签: iphone objective-c xcode methods ipod

好吧,我已经开始使用Head First iPhone开发(O'reilly)进行iPod / iPhone编程,而且我正在输入书中的代码。有两个问题,一个是编程相关而另一个不是。

  • 我不了解objective-c方法的格式。根据本书的源代码,我现在收到一些错误。这导致 我到下一期。

  • 有些代码是错误的。我是这么认为的,因为我无法在不修改代码的情况下运行代码。这本书在文中有一些拼写错误,因为它是第一版和诸如此类的东西,但是我的“修复”代码可以与它有关吗?

所以... 我在哪里可以更多地了解Objective-c方法以及它们在结构方面的工作方式以及返回类型和参数的位置?

对于那些有书的人,我从一开始就处于InstaTweet应用程序的中间位置。

感谢。

6 个答案:

答案 0 :(得分:5)

也许比较“c-like”语言和obj-c之间的比较是有用的 - 让我们选择Java。想象一下带有setBackgroundColor方法的Rectangle类。我们假设我们有一个名为rect的Rectangle实例。

在Java中,方法签名可能是

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

在Objective-C中,参数是方法签名的一部分,因此它可能是

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

“ - ”表示它是Rectangle类的实例方法。 (void)是方法的返回类型。然后来论证。每个冒号定义一个参数,该参数是键入的(在本例中每个arg都是(int))。

让我们比较调用这些方法。爪哇:

rect.setBackgroundColor(255, 255, 0);

的OBJ-C:

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

很多人偶然发现了obj-c的语法 - 你并不孤单。希望这种比较能让事情更加清晰。它也体现了目标c的语言力量:在通话时,你的论点是清楚的。如果我正在阅读代码并看到被调用的Java方法,那么参数不是显而易见的是红色,蓝色和绿色。在obj-c中,很明显我们正在设置单独的颜色值。当然,大多数开发人员可以猜测setColor方法的三个参数是什么,但更复杂的方法会让人感到困惑。这是一个用Java和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;

在通话时间:

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

Objective-c更冗长,但更具可读性。在Java示例中,“2”和“true”参数的含义并不十分清楚。 Objective-c几乎就像英文一样。

其他人已经发布了更多深入指南的链接,但我希望这能让你超越句法绊脚石,足以让链接变得有用。我很乐意回答您提出的更具体的问题。根据我的经验,obj-c新手在语法方面非常艰难,然后点击并感觉非常棒。挂在那里!

答案 1 :(得分:1)

查看Apple的Intro to Objective C

基本方法格式为

-(ReturnType *)methodName:(VariableType *)variableName{

}

例如:

-(NSString *)giveMeANewStringFromAnOldString:(NSString *)oldString{

}

您还应该查看本书的网站上的勘误表。

答案 2 :(得分:1)

Objective-C方法的定义非常简单。实际上,它与常规C函数调用定义非常相似。最大的补充是命名参数的选项。这是一个例子:

-(int)addX:(int)x toY:(int)y
{
    return x + y;
}

您可以通过向相应的对象发送消息来使用它:

int z = [object addX:x toY:y];

在这种情况下,我给出了相同名称的参数和参数,以便清楚地说明事情的排列方式。你可以轻松地做到:

int z = [object addX:4 toY:7];

之后,z将为11。

答案 3 :(得分:1)

我做了同样的事情。我也拿起了Head First iPhone开发书(包括3.1 SDK)。

我浏览了其中的所有教程,发现只有一个错误导致我的应用程序无法正常工作(我在书中记下了它但我现在找不到它了。)。

所以在那之后我意识到我遇到了与语法完全相同的问题。

我选择了Stephen G. Kochan撰写的“Objective-C 2.0编程”。 (这简直太棒了。)这本书简洁明了。我甚至没有通过这本书的25%,我的所有问题都得到了解答。

阅读Objective-C代码让我好几个月,因为我已经习惯了不同的语法,我的大脑花了一点时间来调整目标C的预期方式。

我发现的是,一旦你将大脑包裹起来,Objective-C代码就变得非常易读了。 Carl Norum上面的例子是可读性的一个很好的证明。

[object addX:4 toY:7];

它没有那么多可读性!

另外一些术语有点不同。 “传达一个对象”与“调用一种方法”也让我感兴趣了几个星期。

我希望这本书的推荐可以帮到你,这真的对我很有帮助。

答案 4 :(得分:0)

Apple有一些很好的学习资源:

Learning Objective-C: A Primer

Coding Guidelines for Cocoa

祝你好运!

答案 5 :(得分:0)

阅读Cocoa(R) Programming for Mac(R) OS X (3rd Edition),这是Mac和Cocoa的圣经。

我没有遇到任何问题,但请记住,API总是在向前发展,因此可能会有轻微的更新/更改。但我没有找到任何阻止我完成所有代码示例和练习的内容。

这是要读的书。