我是一个老程序语言程序员,正在努力学习 Obj C。在拔掉我所有的头发后,我意识到我缺少基本的理解
当我分配一个对象(myObj)的实例,通过方法给它一些数据,并调用一个方法/向该实例发送消息时,实现例程可以假设该实例中的所有数据都可用吗?
即 [myObj doSomeStuff] doSomeStuff 的实现可以假设 myObj 的所有实例数据都可用,还是我需要作为我需要的 myObj 的所有部分和片段的参数发送?
我是一个老程序语言程序员,正在努力学习 Obj C。在拔掉我所有的头发后,我意识到我缺少基本的理解
当我分配一个对象(myObj)的实例,通过方法给它一些数据,并调用一个方法/向该实例发送消息时,实现例程可以假设该实例中的所有数据都可用吗?
即 [myObj doSomeStuff] doSomeStuff 的实现可以假设 myObj 的所有实例数据都可用,还是我需要作为我需要的 myObj 的所有部分和片段的参数发送?
Luis 和 rmaddy 所说的同上。其中一些最好用一个例子来说明。让我们考虑一个 Circle 类对象:
这是.h文件:
// Circle.h
#import <Foundation/Foundation.h>
@interface Circle : NSObject
{
double radius;
double pi;
}
@property double radius, pi;
-(double) area;
-(double) diameter;
-(double) circumference;
@end
然后是实现文件(注意我已经定义了 Luis 指出的实例方法):
// Circle.m
#import "Circle.h"
@implementation Circle
@synthesize radius, pi;
// Initialize with default radius:
- (instancetype)init {
self = [super init];
if (self) {
pi = 3.14159;
NSLog(@"Circle created.");
}
return self;
}
-(double) area {
return pi*radius*radius;
}
-(double) diameter {
return 2*radius;
}
-(double) circumference {
return 2*pi*radius;
}
@end
现在在 main 中创建一个 circle 对象并发送消息以返回几个相关数量:
// main.m
#import <Foundation/Foundation.h>
#import "Circle.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Circle *aCircle = [[Circle alloc] init];
[aCircle setRadius:2];
NSLog(@"Area = %f",[aCircle area]);
NSLog(@"Circumference = %f",[aCircle circumference]);
NSLog(@"Diameter = %f",[aCircle diameter]);
NSLog(@"Check pi = %f",[aCircle pi]);
}
return 0;
}
您可以从这个例子中看到pi的值是在创建对象时设置的,然后作为对象的一部分存储,可用于其他计算。
注意:你不会想在实践中这样定义pi,这只是一个简单的例子来说明这一点。
另请注意,我可以在创建对象后设置对象的其他内部值,然后从那时起也可以使用此数据,但须符合帖子中指出的条件。
这是否更有意义?你应该运行这段代码并试验这个想法,直到你感觉更舒服为止。
编辑:在 Andrew Madsen 的建议下,更新了面积、直径和周长的访问器方法;这些不应以'get'为前缀
YES,如果方法是实例方法(那些以“-”而不是“+”开头的方法)。