首先要做的事情:作为风格说明,将您的牙套放在一起:
[ 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."];
请注意,我也没有大写g
in greetPerson
。这是 Objective-C 的风格惯例。
不要忘记一个对象有它自己的身份,所以你很少需要在一个对象(用来代表一个人)与某人交谈之前指示它是谁。当你写消息时,它应该读起来像英语。当你遇到多个论点时——诚然,很少见——开始用逗号思考:
[john sendEmailToPerson:kelly withSubject:subject body:body attachments:nil];
看看它是如何流动的?甚至还有一些不足之处,我也没有掌握这个。给它点时间。
一个非常有用的文档是 Apple 的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;
}
这段代码完全未经测试,所以如果它顺利运行,我会印象深刻。