Objective c 我可以将下面的轮胎阵列设置为NSArray吗?

Objective c 我可以将下面的轮胎阵列设置为NSArray吗?,objective-c,cocoa,Objective C,Cocoa,我在网上查过,但找不到任何可能有用的东西。我的问题是我是否可以将tire[x]数组作为NSArray编写,如果可以,那么声明和分配tire类实例对象的语法是什么 @interface CarClass : NSObject { EngineClass *engine; TireClass *tires[4]; } 编辑: 这是我对CarClass的dealloc方法 - (void) dealloc { NSLog(@"_deal: %@", NSSt

我在网上查过,但找不到任何可能有用的东西。我的问题是我是否可以将tire[x]数组作为NSArray编写,如果可以,那么声明和分配tire类实例对象的语法是什么

@interface CarClass : NSObject {
    EngineClass *engine;
    TireClass *tires[4];        
}

编辑:

这是我对CarClass的dealloc方法

- (void) dealloc {
    NSLog(@"_deal: %@", NSStringFromClass([self class]));
    [engine release];
    [tires release];
    [super dealloc];
}
对于下面的NSArray中的retain仍然有点困惑,如果我在CarClass:init中添加一个额外的[tires retain],那么轮胎不会被释放。但是,由于代码现在为,轮胎释放时有或没有端部保持(即)

最终编辑:我还认为,如果没有单个轮胎上的自动释放,最终释放dealloc中的NSArray将释放数组及其指向的对象,情况似乎并非如此

干杯-加里-

@interface CarClass : NSObject {
    EngineClass *engine;
    NSArray *tires;
}


您不必总是使用NSArray进行收集。通过这种方式,每个轮胎都有更多的信息:

@interface CarClass : NSObject {
    EngineClass *engine;
    NSDictionary *tiresDictionary;
}

@implementation CarClass
- (id) init {
    self = [super init];
    if (!self) {
        return nil;
    }
    NSLog(@"_init: %@", NSStringFromClass([self class]));
    engine= [[EngineClass alloc] init];
    tiresDictionary = [[NSDictionary dictionaryWithObjectsAndKeys:
    [[[TireClass alloc] init] autorelease], @"LeftFrontTyre",
    [[[TireClass alloc] init] autorelease], @"RightFrontTyre",
    [[[TireClass alloc] init] autorelease], @"LeftRearTyre",
    [[[TireClass alloc] init] autorelease], @"RightRearTyre",
    nil] retain];
    return self;
}

这样,您仍然有一个collection类,但您没有尝试记住数组的哪个索引引用哪个轮胎,而是有一个带有描述性键的字典,这样您就可以通过名称引用每个轮胎。

您不必总是使用NSArray进行集合。通过这种方式,每个轮胎都有更多的信息:

@interface CarClass : NSObject {
    EngineClass *engine;
    NSDictionary *tiresDictionary;
}

@implementation CarClass
- (id) init {
    self = [super init];
    if (!self) {
        return nil;
    }
    NSLog(@"_init: %@", NSStringFromClass([self class]));
    engine= [[EngineClass alloc] init];
    tiresDictionary = [[NSDictionary dictionaryWithObjectsAndKeys:
    [[[TireClass alloc] init] autorelease], @"LeftFrontTyre",
    [[[TireClass alloc] init] autorelease], @"RightFrontTyre",
    [[[TireClass alloc] init] autorelease], @"LeftRearTyre",
    [[[TireClass alloc] init] autorelease], @"RightRearTyre",
    nil] retain];
    return self;
}

这样,您仍然有一个collection类,但是您没有尝试记住数组的哪个索引引用哪个轮胎,而是有一个带有描述性键的字典,这样您可以通过名称引用每个轮胎。

我将稍微更改Nikolai的示例。因为我不想添加自动释放并保留不需要的代码,所以代码越少,错误越少

@interface CarClass : NSObject {
  EngineClass *engine;
  NSArray *tires;
}

@implementation CarClass
- (id) init {
  self = [super init];
  if (self) {
    NSLog(@"_init: %@", NSStringFromClass([self class]));
    engine= [[EngineClass alloc] init];
    tires = [[NSArray alloc] initWithObjects:
        [TireClass new], [TireClass new], [TireClass new], [TireClass new], nil];
    [tires makeObjectsPerormSelector:@selector(release)];
  }
  return self;
}
[Tyres MakeObjectsPermSelector:@selector(release)]可能很吓人,但很有用,而且性能也很好。一种性能稍差但可能更清晰的方法是让TireClass实现一个工厂方法,并从该方法创建自动释放的对象。像这样:

+(TireClass)tire;
{
  return [[self new] autorelease];
}

另外,请不要把你的班级命名为“某物”班级,如果你这样做,小猫就会死:)

我会稍微改变一下尼古拉的例子。因为我不想添加自动释放并保留不需要的代码,所以代码越少,错误越少

@interface CarClass : NSObject {
  EngineClass *engine;
  NSArray *tires;
}

@implementation CarClass
- (id) init {
  self = [super init];
  if (self) {
    NSLog(@"_init: %@", NSStringFromClass([self class]));
    engine= [[EngineClass alloc] init];
    tires = [[NSArray alloc] initWithObjects:
        [TireClass new], [TireClass new], [TireClass new], [TireClass new], nil];
    [tires makeObjectsPerormSelector:@selector(release)];
  }
  return self;
}
[Tyres MakeObjectsPermSelector:@selector(release)]可能很吓人,但很有用,而且性能也很好。一种性能稍差但可能更清晰的方法是让TireClass实现一个工厂方法,并从该方法创建自动释放的对象。像这样:

+(TireClass)tire;
{
  return [[self new] autorelease];
}


另外,请停止将您的类命名为“某物”类,否则小猫会死:)

轮胎=[[NSDictionary”应该是“轮胎字典=[[NSDictionary”吗,目前还不是专家,但看起来应该是。如果你把它们都放在字典里……为什么不使用单独的实例变量,比如
TireClass*leftFrontTire
TireClass*righfronttire
,等等?最初的问题是如何将它们存储在一个NSArray中;我只是想指出还有其他的集合可以放入轮胎。实施细节将导致选择on或其他。我现在正在学习,所以欢迎所有想法,非常感谢。@mipadi:iteration over tires.Threes=[[NSDictionary]应该是“tiresDictionary=[[NSDictionary”,目前还不是专家,但看起来应该是。如果你把它们都放在字典里……为什么不使用单独的实例变量,比如
TireClass*leftFrontTire
TireClass*righfronttire
,等等?最初的问题是如何将它们存储在一个NSArray中;我只是想指出还有其他的集合轮胎可以放进去。实现细节将导致选择on或其他。我现在正在学习,所以欢迎所有想法,非常感谢。@mipadi:iteration over tires。我做对了吗,你没有分配数组,而是分配数组包含的对象?很抱歉,我只是想了解一下。代码正在调用
+[NSArray arrayWithObjects::
方法,这是一种方便的方法,可以自动分配然后自动删除数组对象(因此附加了对
retain
的调用)@mipadi你能解释一下保留位吗?我认为代码保留了NSArray,对象后来会自动删除。只是不确定NSArray会发生什么以及为什么会保留它?@fuzzygoat:类需要拥有它的实例变量。没有保留,它就不拥有数组。如果你想在Cocoa中进行任何编程,你需要阅读内存管理规则。它们非常简单,如果你不这样做,你永远不会100%正确。嗨,查克,我已经在这里打印出来了,但最初它有点鸡和蛋,我试图阅读它们,但没有理解足够的可可粉使它有多大的意义。我现在正在阅读各种书籍,以获得更多的信息在再次阅读之前,请先停止。我是否理解正确,您不分配数组,而是分配它包含的对象?很抱歉,我只是想了解一下。代码正在调用
+[NSArray arraywhithobjects::
方法,这是一种方便的方法,可以自动分配,然后自动删除数组对象(因此,附加了对
保留的调用
)@mipadi你能解释一下保留位吗?我认为代码保留了NSArray,对象后来会自动删除。只是不确定NSArray会发生什么以及为什么会保留它?@fuzzygoat:类需要拥有它的实例变量。没有保留,它就不拥有数组。如果你想在Cocoa中进行任何编程,你需要阅读内存管理规则。它们非常简单,如果你不这样做,你永远不会100%正确。嗨,查克,我已经在这里打印出来了,但最初它有点鸡和蛋,我试图阅读它们,但没有理解足够的可可粉使它有多大的意义。我现在正在阅读各种书籍,以获得更多的信息G