【发布时间】:2009-09-23 09:34:04
【问题描述】:
这只是一个帮助我学习Objective-C的测试,它使用NSMutableArray将轮胎对象添加到汽车对象中的实例变量中:
// INTERFACE
@interface CarBody : NSObject {
NSMutableArray *tires;
}
// Should this be (id *) it works but I was convinced it would be pointer?
- (void) addTire:(id)newTire;
@end
@interface TireSnow : NSObject {
}
@end
// IMPLEMENTATION
@implementation CarBody
- (void) addTire:(id)newTire {
[tires addObject:newTire];
// ** Release here or in main()?
}
- (id) init {
[super init];
tires = [[NSMutableArray alloc] init];
NSLog(@"_init: %@", NSStringFromClass([self class]));
return self;
}
- (void) dealloc {
NSLog(@"_deal: %@", NSStringFromClass([self class]));
[tires release];
[super dealloc];
}
@end
我确实有几个问题...
- 在addTire方法中,是(id)对吗,我以为是(id *)
- 释放我要添加到数组中的项目,我应该在 setter 中还是在调用后在 main() 中执行?
- 我是否在正确的位置分配/释放 NSMutableArray(轮胎),感觉对吗?
- 有没有办法用 NSArray 做到这一点(因为我只想要 4 个轮胎),我确实尝试过,但在尝试分配数组并定义其大小时搞混了。
提前感谢您的帮助...
加里
编辑:
我正在阅读内存管理规则,但它们确实需要一些时间来吸收,并且确实需要一定程度的理解,这在开始时很难获得。在这种情况下,我想知道我将在哪里释放我在 main 中分配的 newSnowTire。当我将它添加到 setter 中的数组时,是否会在数组中创建一个新对象(这是我的理解)所以我的想法是我需要释放从 alloc 获得的实例?
// MAIN
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
CarBody *newCarBody_001;
TireSnow *newSnowTire_001;
newCarBody_001 = [[CarBody alloc] init];
newSnowTire_001 = [[TireSnow alloc] init];
[newCarBody_001 addTire:newSnowTire_001];
// Clean up
[newCarBody_001 release];
[newSnowTire_001 release];
[pool drain];
return 0;
}
EDIT_002:
刚刚添加了生成所有 4 个轮胎的代码,并且在调用 setter 后将轮胎释放移动到循环中。
// CREATE TIRES
for(int loopCounter=0; loopCounter<4; loopCounter++) {
newSnowTire_001 = [[TireSnow alloc] init];
[newCarBody_001 addTire:newSnowTire_001];
[newSnowTire_001 release];
}
我刚刚检查过,它是正确的......
- NewSnowTire_001 (alloc) RetainCount = 1
- NewSnowTire_001 (addTire) RetainCount = 2
- NewSnowTire_001(发布)RetainCount = 1
- NewSnowTire_001 最终通过 dealloc 方法释放。
【问题讨论】:
标签: objective-c