第一件事:作为风格说明,将牙套放在一起:
[ Person alloc ]
应该是
[Person alloc]
我还注意到您在分配 Person 时忘记初始化它,您应该使用:
Person *p = [[Person alloc] init];
了解如何声明方法需要一点时间。检查框架如何命名其方法很有用。对于您的具体示例,我认为您过度工程化。你正在寻找这样的东西:
Person *john = [[Person alloc] initWithName:@"John"];
Person *kelly = [[Person alloc] initWithName:@"Kelly"];
[john greetPerson:kelly withGreeting:@"Hey babe."];
[kelly greetPerson:john withGreeting:@"Get bent."];
请注意,我也没有将greetPerson 中的g 大写。这是 Objective-C 的风格惯例。
不要忘记一个对象有它自己的身份,所以你很少需要在一个对象(用来代表一个人)与某人交谈之前指示它是谁。当你写消息时,它应该读起来像英语。当你遇到多个论点时——诚然,很少见——开始思考逗号:
[john sendEmailToPerson:kelly withSubject:subject body:body attachments:nil];
看看它是如何流动的?甚至还有一些不足之处,我也没有掌握这个。给它一点时间。
Apple 的Coding Guidelines for Cocoa 是一个非常有用的文档。
另外,让自己摆脱 C 陷阱。下面是我如何编写你的整个程序(我正在介绍一大堆概念,所以不要指望理解所有内容):
#import <Foundation/Foundation.h>
@interface Person : NSObject {
NSString *name;
}
@property (copy) NSString *name;
- (id)init;
- (id)initWithName:(NSString *)nm;
- (void)greetPerson:(Person *)who withGreeting:(NSString *)grt;
@end
@implementation Person
@synthesize name;
- (id)init {
if (self = [super init]) {
name = @"James Bond"; // not necessary, but default
} // values don't hurt.
return self;
}
- (id)initWithName:(NSString *)nm {
if (self = [self init]) {
name = [nm copy];
}
return self;
}
- (void)greetPerson:(Person *)who withGreeting:(NSString *)grt {
NSLog(@"%@ says '%@' to %@", self.name, grt, who.name);
}
- (void)dealloc {
[name release];
[super dealloc];
}
@end
int main(int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Person *john = [[Person alloc] initWithName:@"John"];
Person *kelly = [[Person alloc] initWithName:@"Kelly"];
[john greetPerson:kelly withGreeting:@"StackOverflow is great, isn't it?"];
[kelly greetPerson:john withGreeting:@"Weren't we supposed to flirt?"];
[john release];
[kelly release];
[pool drain];
return 0;
}
此代码完全未经测试,所以如果它运行顺利,我会印象深刻。