2013-07-26 82 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