[英]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.