繁体   English   中英

Objective-C中的id指针

[英]id pointer in 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;

有任何想法吗?

id本身就是一个指针类型,您无需像在类中那样在其上附加*来表示一个指针。

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

首先,看起来BaseEntity是一个类,而不是协议,因此您不能将其用作协议。

其次, id类型本质上是一个指针,因此您通常不想声明一个指向id的指针。

像这样声明您的方法:

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

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

或者,使用NSObject代替id并保留星号,如下所示:

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

同样,可以正确retrieve拼写。

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的指针,但这并不是您所需要的。

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

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

第二种方法更常见:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM