iphone - 对实例方法使用点符号

标签 iphone objective-c ios key-value-coding

我今天在看一段代码,注意到这个特定的编码器使用点符号来访问实例方法(这些方法不接受值,它们只返回值)。

例如:

@interface MyClass : NSObject {

}
-(double)add;
@end

@implementation MyClass
-(double)valueA {
    return 3.0;
}

-(double)valueB {
    return 7.0;
}

-(double)add {
    return self.valueA + self.valueB;
}    
@end

他在他的代码中做到了这一点并且编译器没有提示,但是当我像上面的例子一样在我的代码中尝试它时,我得到以下错误:“在非结构或联合的东西中请求成员“valueA” ”。我错过了什么,知道吗?

最佳答案

点语法通常应用于声明的属性,但这不是强制性的。使用 obj.valueAobj.valueB 确实有效。

您收到的错误消息可能是由于对象没有显式类型 MyClass *。例如以下作品:

MyClass *obj1 = [MyClass new];
NSLog(@"%f %f %f", obj1.valueA, obj1.valueB, [obj1 add]);

另一方面:

MyClass *obj1 = [MyClass new];
NSLog(@"%f %f %f", obj1.valueA, obj1.valueB, [obj1 add]);

id obj2 = obj1;
NSLog(@"%f %f %f", obj2.valueA, obj2.valueB, [obj2 add]);

给出:

error: request for member ‘valueA’ in something not a structure or union
error: request for member ‘valueB’ in something not a structure or union

因为 obj2 的类型是 id,所以编译器没有足够的信息知道 .valueA.valueB 实际上是getter 方法-valueA-valueB。如果您将 MyClass 类型的对象放在 NSArray 中,然后通过 -objectAtIndex: 检索它们,就会发生这种情况,因为此方法返回一个通用对象id 类型。

为了安抚编译器,您需要将对象转换为 MyClass *,然后才使用点语法。您可以通过以下方式完成此操作:

MyClass *obj2 = obj1;
// or
MyClass *obj2 = [someArray objectAtIndex:someIndex];
// and then
obj2.valueA

或者,如果 obj2 声明为 id:

((MyClass *)obj2).valueA

或者,如果对象由返回类型为 id 的方法返回:

((MyClass *)[someArray objectAtIndex:someIndex]).valueA

或者,您可以简单地完全摆脱点语法(我最喜欢的):

[obj2 valueA]
[[someArray objectAtIndex:someIndex] valueA]

关于iphone - 对实例方法使用点符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6364555/

相关文章:

iphone - 将多个上下文与核心数据一起使用时出现错误 133000

web-services - 将哪个框架集成到我的项目中以使用 Web 服务

ios - 与 Web 服务同步时使用 NSFetchedResultsController 的缓存

iphone - CCLayerColor 没有按预期工作

iphone - 允许用户从免费版本中购买付费应用程序版本?

ios - 前进到特定的键盘 Xcode

ios - Firebase自定义身份验证问题 token 不同的受众

iphone - 当用户返回上一个 View 时如何停止计时器

ios - 通过引用传递 UIButton

objective-c - cocoa 全局捷径?