2010-12-20 73 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