0
  1. 当我编译这个时,我不断得到零而不是值,有什么建议吗?

  2. 这里的代码是关于我创建的一个简单的矩形类。

     #import <Foundation/Foundation.h>
    
     @interface Rectangle : NSObject {
           int width;
           int height;
     }
     @property int width, height;
     -(int) area;
     -(int) perimeter;
     -(void) setWH: (int) h: (int) w;
    
     @end
    
    
     #import "Rectangle.h"
    
     @implementation Rectangle
     @synthesize width, height;
     -(int) area {
          width*height;
     }
     -(int) perimeter {
          (width+height)*2;
     }
     -(void) setWH:(int)h :(int)w {
           w = width;
           h = height;
     }
     @end
    
    
    
     #import <Foundation/Foundation.h>
     #import "Rectangle.h" 
    
     int main (int argc, const char*argv[]) {
            @autoreleasepool {
                   Rectangle* r = [[Rectangle alloc]init];
    
                   [r setWH: 6:8];
                   NSLog(@"the width of the rectangle is %i and the hieght %i", r.width, r.height);
                   NSLog(@"the area is %i and the perimeter is %i", [r perimeter], [r area]);
    
       }
     }
    
4

2 回答 2

3

你翻转了变量赋值:

-(void) setWH:(int)h :(int)w {
       w = width;
       h = height;
 }

它应该是

-(void) setWH:(int)h :(int)w {
       width = w;
       height = h;
 }
于 2013-06-25T01:12:46.507 回答
2

一开始我什至不明白它是如何编译的,因为没有self. 然后我看到了实例变量。

 @interface Rectangle : NSObject {
       int width;
       int height;
 }
 @property int width, height;

不要那样做。在现代objective-c中,您根本不必为属性编写实例变量,它们将被自动合成(顺便说一句您也不需要@synthesize)。当然,你可以自由地编写它们(特别是如果你开始学习 OBjective-C),但是你最好为实例变量选择其他名称,否则会导致混淆。标准做法是在属性名称前加上下划线。

//interface
@property (nonatomic, assign) int myProperty;

//implementation
@synthesize myProperty = _myProperty; //this will synthesize a getter, a setter and an instance variable "_myProperty"

而且您通常应该更喜欢访问属性而不是实例变量,因为这样您就可以更改属性(getter/setter/methods of storage data)实现而不更改其他所有内容。因此,area更好perimeter的解决方案是这样的(@PerfectPixel 已经告诉过你,return所以请注意self)。

-(int) area {
    return self.width * self.height;
}
-(int) perimeter {
    return (self.width + self.height) * 2;
}
于 2013-06-25T06:27:25.700 回答