我不确定我是否使用了正确的术语,请理解我昨天刚开始尝试使用目标,而且我来自c#背景,所以我可能会使用一些c#术语。
随着说。我有两节课。 1个主要类,它使用另一个类作为属性:
@class Fighter;
@interface Match : NSObject{
int Id;
Fighter *Fighter;
int FScore;
}
@property int Id, FScore;
@property Fighter *Fighter;
@end
*实施:
@implementation Match
@synthesize Id, FScore, Fighter;
@end
这是引用的类:
@interface Fighter : NSObject{
int Id;
NSString *Name;
}
@property int Id;
@property NSString *Name;
@end
@implementation Fighter
@synthesize Id, Name;
@end
现在我将如何创建对象的实例
@autoreleasepool {
// insert code here...
NSLog(@"Hello, World!");
Match *match = [[Match alloc]init];
match.Id = 1;
match.Fighter = [[Fighter alloc]init];
match.Fighter.Id = 9;
match.Fighter.Name = @"womp";
}
现在,我想知道在分配战斗机实例的值时是否有快捷方式。和c#一样,你可以这样做:
match.Fighter = new Fighter{ Id = 9, Name = "womp" };
想要知道以防万一我可以在该类或任何其他类中添加更多属性。
PS。
使用[[Class alloc] init]比[Class new] ??
更好感谢!!!
答案 0 :(得分:1)
在Objective-C中执行此操作的典型方法是创建一个自定义-init
方法,其中包含要初始化的属性的参数。所以你可能有一个-[Fighter initWithID:name:]
方法:
- (id)initWithID:(NSInteger)id name:(NSString *)name
{
self = [self init];
if (self) {
self.ID = id;
self.name = name;
}
return self;
}
然后用:
创建战斗机对象match.fighter = [[Fighter alloc] initWithID:9 name:@"womp"];
对您的代码进行一些评论。在Objective-C中,通常使用小写字母开始属性名称。例外情况是该属性的名称是' ID'或者' URL',在这种情况下,你将它全部大写。方法和变量名称也是如此。大写名称保留用于包括类名的类型(例如' Fighter')。
关于你的P.S.问题,+new
只调用alloc然后返回init并返回结果,因此它们完全等效。也就是说,+ new在Objective-C程序员中并不常用,你会更频繁地看到alloc / init使用很多。
最后,假设您使用现代Objective-C运行时(10.6+和64位)部署到目标,您不需要显式声明实例变量来支持您的@properties,因为编译器将为您合成(创建)它们。使用最新版本的Xcode(4.4及更高版本),您甚至不需要@synthesize语句,因为编译器也会为您插入这些语句。 @property语句就是您所需要的。