关注iphone开发、资讯、软件

谈谈Objective-C中@class的作用和用法

通过上一篇的学习,我们已经可以设置矩形或者正方形(Rectangle)的宽、高及原点。首先,完整地看一下接口文件Rectangle.h,然后再来接着引入我们这篇文章要讲的主题@class:

#import <Foundation/Foundation.h>
@class XYPoint;
@interface Rectangle: NSObject
{
int width;
int height;
XYPoint *origin;
}
@property int width, height;
-(XYPoint *) origin;
-(void) setOrigin: (XYPoint *) pt;
-(void) setWidth: (int) w andHeight: (int) h
-(int) area;
-(int) perimeter;
@end
在Rectangle.h头文件中使用一个新的指令:

@class XYPoint;

这是因为编译器在遇到为Rectangle定义的实例变量XYPoint时,必须了解XYPoint是什么。类名还分别用在setOrigin:和origin方法的参数及返回类型声明中。你还有另一个选择,可以如下所示导入头文件来代替它:

#import “XYPoint.h”

使用@class指令提高了效率,因为编译器不需要处理整个XYPoint.h文件(虽然它很小)。而只需知道XYPoint是一个类名字。如果需要引用XYPoint类中方法,@class指令是不够的,因为编译器需要更多消息。它需要知道该方法中有多少参数、它们是什么类型、方法的返回类型是什么。

下面填充新的XYPoint类和Rectangle方法的空白,这样就可以在一个程序中测试所有内容。首先,下面的代码显示了XYPoint类的实现文件。

#import “XYPoint.h”
-(void) setOrigin: (XYPoint *) pt
{
origin = pt;
}
-(XYPoint *) origin
{
return origin;
}
@end
以下是完整的XYPoint和Rectangle类定义,接着是测试程序。

XPoint.h接口文件:

#import <Foundation/Foundation.h>
@interface XYPoint: NSObject
{
int x;
int y;
}
@property int x, y;
-(void) setX: (int) xVal andY: (int) yVal;
@end
XPoint.m实现文件:

#import “XYPoint.h”
@implementation XYPoint
@synthesize x, y;
-(void) setX: (int) xVal andY: (int) yVal
{
x = xVal;
y = yVal;
}
@end
Rectangle.h接口文件:

#import <Foundation/Foundation.h>
@class XYPoint;
@interface Rectangle: NSObject
{
int width;
int height;
XYPoint *origin;
}
@property int width, height;
-(XYPoint *) origin;
-(void) setOrigin: (XYPoint *) pt;
-(void) setWidth: (int) w andHeight: (int) h;
-(int) area;
-(int) perimeter;
@end
Rectangle.m实现文件:

#import “Rectangle.h”
@implementation Rectangle
@synthesize width, height;
-(void) setWidth: (int) w andHeight: (int) h
{
width = w;
height = h;
}
–(void) setOrigin: (Point *) pt
{
origin = pt;
}
–(int) area
{
return width * height;
}
–(int) perimeter
{
return (width + height) * 2;
}
–(Point *) origin
{
return origin;
}
@end
测试程序:

#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 w = 5, h = 8
Origin at (100, 200)
Area = 40, Perimeter = 26
到这里,你应该知道Objective-C中的@class指令是做什么用了的吧,希望对你有所帮助。

标签: Objective-C, @class
Posted by iOS88 @ 2011-12-18 20:09:17 阅读(571) 评论(9)
上一篇:Objective-C中Point类和内存分配
下一篇:cocos2d-x在win32环境下响应键盘消息

我也来参与讨论

  1. 回复 2011-12-18 21:49:32 by ftvx

    这个
    –(void) setOrigin: (Point *) pt
    {
    origin = pt;
    }

    这句话是建立一个方法,名字上setyuandian。 一个名字叫pt的参数,此参数的类型是XYpoint的。

    myRect.origin = myPoint;有什么关系呢?

    myRect.Origin=myPoint 这句话能调用setOrigin的吗?如果能怎么调用的呢?它并没有写调用

    setOrigin这个方法名啊? 求教
  2. 回复 2011-12-18 22:27:38 by iOS88

    @ftvx:

    这个其实是等价于:

    [myRect setOrigin: myPoint];

  3. 回复 2011-12-19 8:42:29 by ftvx

    是。myRect.Origin=myPoint  等价与

    [myRect setOrigin: myPoint]; 吗?

     

    第二个问题。

    –(void) setOrigin: (Point *) pt
    {
    origin = pt;
    }
     
    这句有什么用呢?
     
    多谢多谢
  4. 回复 2011-12-19 10:09:37 by iOS88

    @ftvx:

    第一个问题:没错,myRect.Origin=myPoint 等价于[myRect setOrigin: myPoint];

    第二个问题:

    –(void) setOrigin

    是一个origin属性的set访问器,在objective-c2.0中,类属性的get、set访问器的声明由@property标识,然后实现的时候用@synthesize标识。但是有一个特点,当你有很多属性需要定义的时候,为了方便,我们可以用@property int width来构造width的get、set访问器,相当于这样子写:

    - (int)width;

    - (void)setWidth:(int)newWidth;

    所以当你myRect.Origin=myPoint的时候就相当于自动调用了他的set访问器,也就是调用了setOrigin。

    我不知道这样子讲你是否明白。

  5. 回复 2011-12-19 10:52:16 by ftvx

    也就是说set是个特殊字符?我刚刚学,第7章类中有一个

    –(void) add: (Fraction *) f
    {
    numerator=numerator*f.denominator+denominator*f.numerator;
     
    denminator=denominator*f.denominator
    }
    测试.m中
    Fraction*aFraction=[[NSAutoreleasePool alloc]init];
    Fraction*bFraction=[[NSAutoreleasePool alloc]init];
    [aFraction add : bFraction]我就以为如果用到
    –(void) add: (Fraction *) f这个方法就要写上add,就像[aFraction add : bFraction]这样有add才行。
    而上一个程序的测试.m中并没有有写出(setOrigin) 这几个字(所以就实在不明白测试程序是怎么能用setOrigin到,然后来执行
    setOrigin:
    –(void) setOrigin: (Point *) pt
    {
    origin = pt;
    }
    方法的。)
  6. 回复 2011-12-19 11:07:56 by ftvx

    是用到Origin的时候直接就到setOrigin了吗?

     

  7. 回复 2011-12-19 11:08:24 by iOS88

  8. 回复 2011-12-19 21:17:13 by ftvx

    最后一个问题。我把这个复制到了xcode中运行,build succeeded ,可是没用得出结果,而是这样。Thread 1 : Stopped at breakpoint 1


    如图:http://www.itivy.com/DownloadFile.ashx?id=634599260455711601  万分感谢

  9. 回复 2011-12-20 11:12:05 by ftvx

    哦。。。。晕死,脑子没转过来,会了会了。

你还可以输入600/600个字符 发表评论
称呼: (必填) 登录 | 开通博客
邮箱: (选填) 你的邮箱地址不会被公开
网站: (选填)
验证码: (必填)
看不清换一张 看不清楚换一张