newbie objective c指针问题“*”语法

时间:2010-11-23 15:33:59

标签: objective-c pointers

我经常收到关于将错误的指针类型传递给函数的警告,我只想一劳永逸地理解这一点。

这两者有什么区别?

CFURLRef *ref=(CFURLRef *)sourceURLArray[0];

CFURLRef ref=(CFURLRef )sourceURLArray[0];

第一个实际引用数组中对象的内存地址吗? 第二个是否复制了它?

我目前追求的主要代码风格是拥有一系列值或对象。我希望能够使用这些值,将它们传递给其他函数,而无需更改原件。

由于我一直在尝试的2个函数声明,因此如下所示。

- (void) loadAudioFileIntoMemory:(CFURLRef *)address channel:(int) value row:(int) value2;

- (void) loadAudioFileIntoMemory:(CFURLRef )address channel:(int) value row:(int) value2;

有什么区别?

1 个答案:

答案 0 :(得分:5)

CFURLRef已经是一个指针 - 它是declared

typedef const struct __CFURL *CFURLRef;

通常,在声明用于保存URL的变量时,您需要使用不带* 的CFURLRef 类型。大多数(或全部?)Core Foundation对象都是以这种方式定义的,您可以假设以Ref结尾的类型是指针。

因此,如果您想要一个包含10个URL的数组,您可以编写如下内容:

CFURLRef sourceURLArray[10];
//... populate the array.
// Get a particular URL out of the array:
CFURLRef ref = sourceURLArray[0];

可能会让这有点令人困惑的是,Objective-C对应的NSURL 需要*才能使它成为所有Cocoa对象的指针。所以你写的东西是:

NSURL *sourceURLArray[10];
...
NSURL *url = sourceURLArray[0];

最后,您可能会发现使用NSArrayNSURL个对象比使用普通C数组更容易:

NSArray *sourceURLs = [NSArray arrayWithObjects:...];
NSURL *url = [sourceURLs objectAtIndex:0];