0

我不确定我是否使用了正确的术语,请理解我昨天才开始尝试客观,我来自 ac# 背景,所以我可能会使用一些 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";
    }

现在,我想知道在为 Fighter 实例分配值时是否有捷径。在 c# 中,您可以执行以下操作:

match.Fighter = new Fighter{ Id = 9, Name = "womp" };

想知道以防万一我可以向该类或任何其他类添加更多属性。

PS。

使用 [[Class alloc] init] 是否比 [Class new] 更好?

谢谢!!!

4

1 回答 1

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”)。

关于你的 PS 问题,+new只需调用 alloc 然后 init 并返回结果,所以它们是完全等价的。也就是说,+new 在 Objective-C 程序员中并不常用,你会看到 alloc/init 的使用频率更高

最后,假设您使用现代 Objective-C 运行时(10.6+ 和 64 位)部署到目标,您不需要显式声明实例变量来支持您的 @properties,因为编译器将合成(创建)它们为你。对于最新版本的 Xcode(4.4 和更高版本),您甚至不需要 @synthesize 语句,因为编译器也会为您插入这些语句。@property 语句就是您所需要的。

于 2012-11-08T23:11:23.363 回答