我正在尝试通过Objective-C教程。书中有这个例子:
@interface
{
int width;
int height;
XYPoint *origin;
}
@property int width, height;
我想,“嘿,XYPoint对象没有getter / setter。但代码确实有效。”现在我要回答我自己的问题:)。
我认为它是因为“原点”已经是一个指针,并且在“宽度”和“高度”的引擎盖下发生的是,是否会创建指向它们的指针。
我是对的,还是我在说BS :) ??
我就是不明白。主要是:
#import "Rectangle.h"
#import "XYPoint.h"
int main (int argc, char *argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Rectangle *myRect = [[Rectangle alloc] init];
XYPoint *myPoint = [[XYPoint alloc] init];
[myPoint setX: 100 andY: 200];
[myRect setWidth: 5 andHeight: 8];
myRect.origin = myPoint;
NSLog (@"Rectangle w = %i, h = %i",
myRect.width, myRect.height);
NSLog (@"Origin at (%i, %i)",
myRect.origin.x, myRect.origin.y);
NSLog (@"Area = %i, Perimeter = %i",
[myRect area], [myRect perimeter]);
[myRect release];
[myPoint release];
[pool drain];
return 0;
}
这是Rectangle对象:
#import "Rectangle.h"
#import "XYPoint.h"
@implementation Rectangle
@synthesize width, height;
-(void) setWidth: (int) w andHeight: (int) h
{
width = w;
height = h;
}
- (void) setOrigin: (XYPoint *) pt
{
origin = pt;
}
-(int) area
{
return width * height;
}
-(int) perimeter
{
return (width + height) * 2;
}
-(XYPoint *) origin
{
return origin;
}
@end
我不明白这一行是主要的:myRect.origin = myPoint;
我没有为它制作一个制定者..
BTW感谢您的快速回复
答案 0 :(得分:23)
我不明白这一行是主要的:
myRect.origin = myPoint;
我没有为它制作一个制定者..
是在origin
类中为Rectangle
创建的getter和setter(统称为 accessors )。如果您查看Rectangle
的实现,这就是getter:
-(XYPoint *) origin
{
return origin;
}
这是二传手:
- (void) setOrigin: (XYPoint *) pt
{
origin = pt;
}
从Objective-C 2.0调用开始:
myRect.origin = myPoint;
相当于:
[myRect setOrigin:myPoint];
使用@property
声明getter和setter(然后使用@synthesize
实现它们)只是声明和创建访问器的一种方式,如果你有很多要声明的属性,这是方便的类接口。正如Schildmeijer
所述,@property int width
相当于声明两种方法:
- (int)width;
- (void)setWidth:(int)newWidth;
由于Objective-C方法调用的动态绑定特性,您甚至 都没有在接口中声明getter和setter方法,尽管通常最佳做法是如果您将其公开发布给其他课程。
答案 1 :(得分:6)
您可以将属性声明视为等同于声明两个存取方法。因此
@property int width;
相当于:
- (int)width;
- (void)setWidth:(int)newWidth;
答案 2 :(得分:1)
//Rectangle.h
#import <Foundation/Foundation.h>
@interface Rectangle : NSObject
@property int Width;
@property int Height;
-(int)Area;
@end
//Rectangle.m
#import "Rectangle.h"
@implementation Rectangle
@synthesize Width;/*Will create value Width , Setter called"setWidth" and Getter called "Width"*/
@synthesize Height;/*Will create value Height , Setter called"setHeight" and Getter called "Height"*/
-(int)Area
{
return Width*Height;
}
@end
// main.m
#import <Cocoa/Cocoa.h>
#import "Rectangle.h"
int main(int argc, const char * argv[])
{
Rectangle *myRectangle = [Rectangle new];
myRectangle.Width=3;
myRectangle.Height=5;
printf("Area = %d\n",[myRectangle Area]);
//Or
[myRectangle setWidth:5];
[myRectangle setHeight:6];
printf("Area = %d\n",[myRectangle Area]);
}
如果您只想制作Getter或重命名getter和setter
•readonly
•getter = newGetterName
•setter = new SetterName
例如
//Rectangle.h
#import <Foundation/Foundation.h>
@interface Rectangle : NSObject
@property (getter = getWidth) int Width;
@property (readonly) int Height;
@end
答案 3 :(得分:0)
您没有说明哪些代码有效,或者您对“工作”的期望是什么。
上面的界面将为宽度和高度创建简单的访问器方法,可以从[object setWidth:1];
或object.width = 1;
等其他对象调用 - 这两种方法类似。
Origin是一些其他对象类型,是一个指针,是的。但是你仍然想要声明一个属性来生成访问器方法。
答案 4 :(得分:0)
如果您需要从另一个类访问实例变量,或者您正在使用绑定来获取/设置它们,那么Getter和setter最有用。所以我的猜测是你需要这个功能的宽度和高度,但不是原点。请注意,getter / setter不会按照您所说的原因指出整数。 Int是整数,getter / setter不会改变它。