Objective-C中的id指针

Objective-C中的id指针,objective-c,Objective C,我是Objective-C新手。我来自Java背景。我试图在objective-c中创建一个通用函数,如下所示: - (id<BaseEntity>*)retreive:(NSString *)idValue unpackedWith:(id<ITransferObject>*) transferObject{ NSString * url = [[[self baseUurl] stringByAppendingString: [self getPath]]st

我是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;
}
我得到了一个错误:

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

有什么想法吗?

id
本身就是一种指针类型,您不需要像处理类那样在其上附加*来表示指针

- (id<BaseEntity>)retrieve:(NSString *)idValue unpackedWith:(id<ITransferObject>)transferObject
-(id)检索:(NSString*)idValue解压为:(id)transferObject

id
本身就是一种指针类型,您不需要像处理类那样在其上附加*来表示指针

- (id<BaseEntity>)retrieve:(NSString *)idValue unpackedWith:(id<ITransferObject>)transferObject
-(id)检索:(NSString*)idValue解压为:(id)transferObject

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

其次,
id
类型本身就是一个指针,因此通常不希望声明指向-
id
的指针

改为按如下方式声明您的方法:

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

另外,正确的拼写是
retrieve

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

其次,
id
类型本身就是一个指针,因此通常不希望声明指向-
id
的指针

改为按如下方式声明您的方法:

- (BaseEntity *)retreive:(NSString *)idValue unpackedWith:(id<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;
-(id)检索:(NSString*)idValue解包为:(id)transferObject;

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;
-(id)检索:(NSString*)idValue解包为:(id)transferObject;

响应属性
的类型为
BaseEntity
,与
id
的返回类型不匹配。另外,
id
已经是一个指针,因此
id*
使其成为指向指针的指针。
responseEntity
的类型为
BaseEntity
,与
id
的返回类型不匹配。另外,
id
已经是一个指针,因此
id*
将其作为指向指针的指针。谢谢!我已经做了改变。我现在收到一条警告,指出“Returning BaseEntity*\uu strong构成一个结果类型不兼容的函数
id
。对此有什么想法吗?谢谢!我已经做了更改。我现在收到一条警告,指出“Returning BaseEntity*\uu strong构成一个结果类型不兼容的函数
id
。有什么想法吗?太好了,谢谢!这解决了我的编译问题。你能看看我对rob mayoff评论的评论吗?只剩下一个警告,不确定它到底在说什么。很好地理解这一点可能会很好。@user489041您是否尝试更改为
id responseEntity=…
?谢谢,这就是问题所在,谢谢!这解决了我的编译问题。你能看看我对rob mayoff评论的评论吗?只剩下一个警告,不确定它到底在说什么。很好地理解这一点可能会很好。@user489041您是否尝试更改为
id responseEntity=…
?谢谢,这就是问题所在