目标c为类属性赋值的快捷方式

时间:2012-11-08 23:05:07

标签: objective-c xcode cocoa

我不确定我是否使用了正确的术语,请理解我昨天刚开始尝试使用目标,而且我来自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] ??

更好

感谢!!!

1 个答案:

答案 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语句就是您所需要的。