2013-05-01 157 views
0

目標C新手在這裏:我的int main在下面。問題:爲什麼我得到這個臭名昭着的錯誤消息:「沒有可行性@interface for person declares the selector firstName」沒有人知道@interface爲人

.m文件具有@synthesize firstName,lastName;

#import <UIKit/UIKit.h> 
#import "AppDelegate.h" 
#import "Person.h" 

int main(int argc, char *argv[]) 
{ 
Person *ben = [[Person alloc] init]; 

[email protected]"Ben"; 
NSLog(@"--->%@",ben.firstName); //output ---->Ben 

[ben firstName:"Ben"];  //RED ERR: no visibility @interface for Person 
} 

的.H

#import <Foundation/Foundation.h> 


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

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

- (NSString *) fullName; 
-(void) sayHello; 

@end 

的.M

#import "Person.h" 

@implementation Person 
@synthesize firstName, lastName; 

-(void) sayHello 
{ 
    NSLog(@"Hello"); 
} 

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

@end 
+0

由於「Foundation.h」爲您導入,因此不需要導入「NSObject.h」或「NSString.h」。 – Macro206 2013-05-01 19:37:55

+1

明白了。謝謝! – adhg 2013-05-01 19:41:51

回答

4

用途:

[ben setfirstName:@"Ben"];  

,因爲你設置本爲FirstName。

希望它可以幫助你。

+0

好的,應該是:[ben setfirstName:@「Ben」];謝謝! – adhg 2013-05-01 19:37:55

+0

嗯..最受歡迎:-) – 2013-05-01 19:38:32

2

如果您對獲取者和設置者使用括號語法([foo something][foo setSomething:@"value"]),則自動創建的(或:合成的)設置者以set開頭。所以,你的情況,你就必須做:[ben setFirstName:@"ben"]

另一種方法是使用點語法爲您的getter和setter(foo.somethingfoo.something = @"value"),你不必使用set前綴。在這種情況下,你做ben.firstName = @"ben"

2

在Objective-C,如果你有名字的firstName屬性,你可以得到/設置它在兩個方面

獲取

NSString *firstName = obj.firstName; 
NSString *firstName = [obj firstName]; 

obj.firstName = @"First Name"; 
[obj setFirstName:@"First Name"]; 
2

使用setter方法,並且不要忘記要構造的@符號NSString s:

[ben setFirstName:@"Ben"]; 
相關問題