Objective-C中的id指针
我是Objective-C新手。我来自Java背景。我试图在objective-c中创建一个通用函数,如下所示: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
- (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
(类似于在Java中传递id
),或者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
(类似于在Java中传递id
),或者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=…
?谢谢,这就是问题所在