2010-12-20 77 views
1

我開始學習Objective C,我做了一個簡單的人上課,我得到6次失誤, 預計符限定符列表前「 - 」令牌目標C一個簡單的人類

只是想知道,有人能向我解釋,我做錯了什麼,

感謝

#import <Foundation/Foundation.h> 
#import <Foundation/NSObject.h> 
#import <Foundation/NSString.h> 


@interface Person:NSObject 
{ 
    NSString *firstName; 
    NSString *lastName; 


    -(void) setFName:(NSString *) theFirstName; 
    -(void) setLName:(NSString *) theLastName; 
    -(void) printName; 
} 
@end 

@implementation Person 
{ 

    -(void) setFName:(NSString *) theFirstName 
    { 
     firstName = [[NSString alloc]initWithString: theFirstName]; 
    } 

    -(void) setLName:(NSString *) theLastName 
    { 
     lastName = [[NSString alloc]initWithString: theLastName]; 
    } 

    -(void) printName 
    { 
     NSLog(@"The person's full name is",firstName,lastName); 
    } 

} 

@end 


int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    Person *person = [[Person alloc] init]; 

    [person setFName:@"Amir"]; 
    [person setLName:@"Karimian"]; 
    [person printName]; 

    [person release]; 
    [pool drain]; 
    return 0; 
} 
+1

任何理由不宣佈'firstName'和'lastName的'使用'@ property'? – 2010-12-20 15:53:21

+0

另外,您可以在初始化程序中設置姓氏和名字。 – Abizern 2010-12-20 16:06:22

+0

而且,既然你提到iPhone,就沒有內存管理代碼。 autorelease池不會影響你的Person類,因爲你還沒有自動釋放任何東西。習慣現在考慮內存管理,否則你以後會遇到問題。 – Abizern 2010-12-20 16:08:45

回答

4

方法的聲明將是右大括號之外。

@interface Person:NSObject 
{ 
    NSString *firstName; 
    NSString *lastName; 
} 

-(void) setFName:(NSString *) theFirstName; 
-(void) setLName:(NSString *) theLastName; 
-(NSString *) firstName; 
-(NSString *) lastName; 
-(void) printName; 

@end 

並且在實現中不需要大括號。

@implementation Person 
// { is not required 
-(void) setFName:(NSString *) theFirstName { 
    // code 
} 

-(void) setLName:(NSString *) theLastName { 

} 

// in this way 

// } is not required 
@end 

至少有兩個邏輯錯誤。在打印名稱

NSLog(@"The person's full name is %@ %@",firstName,lastName); 

您的格式字符串是錯誤的。

而且在主

[person setLName:@"Karimian"]; 

你有用戶 「輯」,而不是 「設置」。

+0

嗨,謝謝你的回覆,現在所有的錯誤都消失了,但是當我運行這個程序時,我還沒有得到這個人的全名,有什麼理由呢? – amir 2010-12-20 15:59:05

+1

可能是因爲這個錯字'[人員serl名稱:@「Karimian」];' – Abizern 2010-12-20 16:04:28

+0

您是否修復了錯字?你有什麼? – taskinoor 2010-12-20 16:09:45

5

或者更簡單:

@interface Person : NSObject 

@property (nonatomic, copy) NSString * firstName; 
@property (nonatomic, copy) NSString * lastName; 

- (NSString *) fullName; 

@end 

@implementation Person 
@synthesize firstName, lastName; 

- (NSString *) fullName { 
    return [NSString stringWithFormat:@"%@ %@", [self firstName], [self lastName]]; 
} 

- (void) dealloc { 
    [self setFirstName:nil]; 
    [self setLastName:nil]; 
    [super dealloc]; 
} 

@end 
0

此外,除了taskinoor的答案,這是實現一個很好的做法 - (空)的dealloc在類方法:

-(void)dealloc { 
    [firstName release]; //since they have been alloced. 
    [lastName release]; 
    [super dealloc]; 
} 

請注意,如果你想要使用Dave DeLong等屬性,您應該謹慎選擇@property(assign)@property(copy)@property(retain)並管理您是否釋放NSString。

1

在頭文件:

@interface Person:NSObject 
    { 
     NSString *firstName; 
     NSString *lastName; 
    } 


    @property(retain, nonatomic) NSString * firstName; 
    @property(retain, nonatomic) NSString * lastName; 

    -(void) setFName:(NSString *) theFirstName; 
    -(void) setLName:(NSString *) theLastName; 
    -(void) printName; 

    @end 

在實現使用@synthesize來創建getter和setter訪問 方法:

@implementation Person 

/* Create the getter and setter properties 
    which are also called accessor methods 
*/ 
@synthesize firstName = _firstName; 
@synthesize lastName = _lastName; 

//The other methods 
-(void) setFName:(NSString *) theFirstName{ 
} 
-(void) setLName:(NSString *) theLastName{ 
} 
-(void) printName{ 
} 

@end