2013-07-26 46 views
-1

我对Objective-C很新,并且创建了这个基本程序。它给我错误@interface部分,有没有简单的解释,你可以给初学者如何建立@interface@implementation部分?下面的程序有什么问题?您如何正确撰写@interface部分?

#import <Foundation/Foundation.h> 

    @interface Rectangle : NSObject { 
    //declare methods 
    - (void) setWidth: (int) a; 
    - (void) setHieght: (int) b; 
    - (double) perimeter; 
    - (double) area; 

    } 
    @end 

    @implementation Rectangle 


    { 
    double area; 
    double perimeter; 
    int width; 
    int height; 
    } 
    - (void) setWidth: (int) a 
    { 
     width = a; 
    } 
    - (void) setHieght: (int) b 
    { 
    hieght = b; 
    } 

    @end 

    int main (int argc, const char * argv[]) 
    { 

    NSAutoreleasePool * Rectangle = [[NSAutoreleasePool alloc] init]; 
    int a = 4 
    int b = 5 
    int area = a * b; 
    int perimeter = 2 * (a +b); 

    NSLog(@"With width of %i and Hieght of %i", a, b); 
    NSLog(@"The perimeter is %i", perimeter); 
    NSLog(@"The Area is %i", area); 

    [pool drain]; 
    return 0; 
    } 
+3

请更新您的问题,列出正在生成的错误并指出错误引用的行。只是说“给我错误”并不是很好。我会注意到,从你的例子中,你很可能会从旧的源代码。 NSAutoreleasePool,[pool drain]等来自旧式的手动内存管理。通常,您的应用程序现在会使用ARC(自动引用计数),这会消除大部分代码,并会在您尝试使用时产生错误。 –

+1

摆脱'@interface'块中的大括号,一切都会很好。 – rmaddy

+0

是的,问题通过在@interface后删除{}来解决,谢谢。 – user2624497

回答

3

您的列表您的方法,艾瓦尔应该去。它应该是:

@interface Rectangle : NSObject { 

    //instance variables here 
} 

// declare methods or properties here 
- (void) setWidth: (int) a; 
- (void) setHieght: (int) b; 
- (double) perimeter; 
- (double) area; 

@end 

正如已经指出的那样,您可以简单地删除花括号。

+3

最好将ivars放在'@ implementation'块中。原始代码唯一的错误是'@interface'上的花括号。摆脱这些,一切都很好。 – rmaddy

+0

有趣的是,我从来没有见过ivars在'@ implementation'之前,但[这里](https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html# // apple_ref/doc/uid/TP40011210-CH5-SW6)。我个人已经采取隐含声明与大多数情况下属性的ivars。 – BergQuester

+1

使用属性也是一个不错的选择。只要确保在.m文件的类扩展名中声明所有私有属性。 .h中只有公共财产和公共方法应该在.h中。 – rmaddy

0

有在你的代码的几个问题,我们将在后面看到他们,但作为初学者,你需要知道的几件事情:

  • main()是在你的项目main.m类,不要乱行动与在这里和那里,用init()代替
  • 你不要在{}您@implementaion
  • 范围申报方法应该写成
  • @implementation没有什么要执行 @end
  • @implementation不应在{}范围,因为它与@end
  • 而一些更月底为界,在这里找到它http://www.slideshare.net/musial-bright/objective-c-for-beginners

所以你应该是这样的:

#import <Foundation/Foundation.h> 

@interface Rectangle : NSObject 

//declare methods 
- (void) setWidth: (int) a; 
- (void) setHieght: (int) b; 
- (double) perimeter; 
- (double) area; 

@end 

@implementation Rectangle 

{ 双倍面积;双周长; int width; int height; }

- (void) setWidth: (int) a { 
    width = a; 
} 

- (void) setHieght: (int) b { 
    height = b; 
} 

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     // Custom initialization 
     int a = 4; 
     int b = 5; 
     int area = a * b; 
     int perimeter = 2 * (a +b); 

     NSLog(@"With width of %i and Hieght of %i", a, b); 
     NSLog(@"The perimeter is %i", perimeter); 
     NSLog(@"The Area is %i", area); 
    } 
    return self; 
} 

@end 
+0

这是不正确的。所有在'@ implementation'行之后声明的变量实际上都是文件全局变量。它们不是实例变量。这些变量需要像大括号一样放在大括号中。 – rmaddy

+0

@rmaddy我同意,谢谢:)。但我想这不会伤害初学者,除非在两个不同的类中声明同名变量。 – rptwsthi

+0

我想你误解了。如果没有花括号,同一个类的两个实例将共享同一组变量。这非常糟糕。 – rmaddy