道歉这些问题对某些人来说是基本的。刚开始学习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。
然而我仍然不明白为什么我在原帖的顶部发布的代码不起作用,我不知道错误是什么意思,我非常感谢喜欢知道,因为我似乎错过了一些重要的东西。
答案 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
的值为5
。 xptr
有一些内存地址作为其值。 *xptr
(xptr
的解除引用值)的值为5,因为xptr
将指向内存中的值
这不是你在Cocoa中需要担心的事情。 API文档将告诉您方法和函数的返回值,而Objective-C对象总是指针。但是有几种类型需要注意:NSRect
,NSPoint
,其他一些值只是C结构(不是 Objective-C对象),因此有时你处理价值观本身,而不是指针。像NSUInteger
这样的东西通常也不是指针(但有时它们是)。
答案 1 :(得分:0)
(出于某种原因,我无法编辑我的原始帖子。)
好的,我再次尝试了以下内容:
[label setStringValue:[NSString stringWithFormat:@"There are %u characters",[[textField stringValue] length]]]
这次实际上工作了。不知道为什么它不是第一次,虽然我认为我可能错误地键入%d而不是%u。
然而我仍然不明白为什么我在原帖的顶部发布的代码不起作用,我不知道错误是什么意思,我非常感谢喜欢知道,因为我似乎错过了一些重要的东西。