Objective-C / Cocoa中的基本问题(类型推断或其他什么?)

时间:2010-04-30 16:49:05

标签: objective-c cocoa

道歉这些问题对某些人来说是基本的。刚开始学习Cocoa,通过Hillegass的书,我正在尝试编写我的第一个程序(一个GUI Cocoa应用程序,用于计算字符串中的字符数)。

我试过了:

NSString *string = [textField stringValue];
NSUInteger *stringLength = [string length];
NSString *countString = (@"There are %u characters",stringLength);
[label setStringValue:countString];

但我得到的错误如下:

Incompatible pointer conversion initializing 'NSUInteger' (aka 'unsigned long'), expected 'NSUInteger *'[-pedantic]
第一行是

,第二行是

Incompatible pointer types initializing 'NSUInteger *', expected 'NSString *' [-pedantic]

我先试过这个,但它也不起作用:

[label setStringValue:[NSString stringWithFormat:@"There are %u characters",[[textField stringValue] length]]]

在类似的说明中,我之前只用简单的脚本语言编写,我不确定何时应该分配/启动对象以及何时不应该。

例如,什么时候可以这样做:

NSString *myString = @"foo";

int *length = 5;

而不是:

NSString *myString = [[NSString alloc] initWithString:"foo"];

我应该将哪些文件放入头文件?


我确实检查了Apple的文档和CocoaDev,以及我正在为之工作的书,但没有运气。也许我在寻找错误的地方..

感谢任何花时间回复此问题的人:感谢您对初学者的耐心。我们都从某个地方开始。

修改

好的,我再次尝试了以下内容:

[label setStringValue:[NSString stringWithFormat:@"There are %u characters",[[textField stringValue] length]]]

这次实际上工作了。不知道为什么它不是第一次,虽然我认为我可能错误地键入%d而不是%u。

然而我仍然不明白为什么我在原帖的顶部发布的代码不起作用,我不知道错误是什么意思,我非常感谢喜欢知道,因为我似乎错过了一些重要的东西。

2 个答案:

答案 0 :(得分:4)

第一个问题是-[NSString length]返回NSUInteger而不是NSUInteger *。第一个是整数;第二个是指针到一个整数(在一秒钟内更多)。第二个问题是这一行:

NSString *countString = (@"There are %u characters",stringLength);

不按预期行事。我想你想格式化一个字符串,但实际上这是在执行表达式@"There are %u characters",然后是stringLength,并返回第二个表达式的值。你想要的是这个:

NSString *countString = [NSString stringWithFormat:@"There are %u characters", stringLength];

你说的不起作用,但我不确定原因。

  

例如,什么时候可以这样做......而不是这个:

当您设置该类型的变量以返回相同类型的值时,这是“好的”。在C中(而Objective-C只是C之上的一些东西),有值,然后有指向值的指针。指向值的指针实际上是指向到内存中值的内存地址。例如,这是int类型的值:

int x = 5;

这是指向该值的指针:

int *xptr = &x;

x的值为5xptr有一些内存地址作为其值。 *xptrxptr的解除引用值)的值为5,因为xptr 指向内存中的值

这不是你在Cocoa中需要担心的事情。 API文档将告诉您方法和函数的返回值,而Objective-C对象总是指针。但是有几种类型需要注意:NSRectNSPoint,其他一些值只是C结构(不是 Objective-C对象),因此有时你处理价值观本身,而不是指针。像NSUInteger这样的东西通常也不是指针(但有时它们是)。

答案 1 :(得分:0)

(出于某种原因,我无法编辑我的原始帖子。)

好的,我再次尝试了以下内容:

[label setStringValue:[NSString stringWithFormat:@"There are %u characters",[[textField stringValue] length]]]

这次实际上工作了。不知道为什么它不是第一次,虽然我认为我可能错误地键入%d而不是%u。

然而我仍然不明白为什么我在原帖的顶部发布的代码不起作用,我不知道错误是什么意思,我非常感谢喜欢知道,因为我似乎错过了一些重要的东西。