Objective-C中的id指针

时间:2014-10-01 20:09:37

标签: objective-c

我是Objective-C的新手。我来自Java背景。我试图在objective-c中创建一个泛型函数,如下所示:

- (id<BaseEntity>*)retreive:(NSString *)idValue unpackedWith:(id<ITransferObject>*) transferObject{
    NSString * url = [[[self baseUurl] stringByAppendingString: [self getPath]]stringByAppendingString: @"/retreive/"];
    url = [url stringByAppendingString:idValue];
    NSMutableURLRequest *request = [self createGET:url];
    NSString *responseString = [self processRequest:request];
    BaseEntity* responseEntity = [transferObject unpack:responseString];
    return responseEntity;
}

我要完成的是创建一个函数,该函数可以获取指向实现ITransferObject协议的任何对象的指针。在ITransferObject协议中定义的此对象上使用函数。然后返回指向实现BaseEntity协议的对象的指针。我觉得我采用了Java泛型方法,但它没有用。

我收到以下错误:

Bad receiver type `__autoreleasing id<ITransferObject> *'

从这一行:

BaseEntity* responseEntity = [transferObject unpack:responseString];

我收到错误:

Implicit conversion of an Objective-C pointer to `__autoreleasing id<BaseEntity> *' is disallowed with ARC

从这一行:

return responseEntity;

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

id本身就是一个指针类型 - 你不需要像对类一样附加一个*来表示指针。

- (id<BaseEntity>)retrieve:(NSString *)idValue unpackedWith:(id<ITransferObject>)transferObject

答案 1 :(得分:1)

首先,看起来BaseEntity是一个类,而不是协议,所以你不能将它用作协议。

其次,id类型本质上是一个指针,因此您通常不希望声明一个指针 - id

改为声明你的方法:

- (BaseEntity *)retreive:(NSString *)idValue unpackedWith:(id<ITransferObject>) transferObject{

(请注意,我已删除transferObject更改了*类型。)

或者,使用NSObject代替id并留下明星,即:

- (BaseEntity*)retreive:(NSString *)idValue unpackedWith:(NSObject<ITransferObject>*) transferObject{

另外,正确的拼写是retrieve

答案 2 :(得分:1)

id是一种特殊类型 - 它是一种不需要星号的引用类型:它已经是一个指针。这是一个说明这一点的例子:

-(void)someMethod:(id)data; // id does not need an asterisk
...
NSString *str = @"Hello";   // NSString needs an asterisk
[self someMethod:str];      // This works

id之后添加星号使类型成为指向id的指针 - 即双指针。当您需要指向id的指针时,有合理的情况,但这不是您所需要的。

您有两种方法可以解决此问题:

  • 您可以更改id NSObject(类似于在Java中传递Object)或
  • id
  • 之后删除星号

第二种方法更常见:

- (id<BaseEntity>)retreive:(NSString *)idValue unpackedWith:(id<ITransferObject>) transferObject;