-2

嗨,我想实现自己的对象来管理我的数据,我试图创建两个类。

包含大陆对象的类大陆

这是我的实现:

@implementation OsContinents
@synthesize continentes;


-(id)init{
    return [super init];
}

-(NSUInteger)count{
    NSLog(@"%u",[continentes count]);
    return [continentes count];
}
-(void)add:(OsContinent *)continente{
    [continentes addObject:continente];
}

-(OsContinent *)getElementByIndex:(NSUInteger)index{
    return [continentes objectAtIndex:index];
}

-(void)deleteContinentByIndex:(NSUInteger)index{
    return [continentes removeObjectAtIndex:index];
}

-(void)deleteContinent:(OsContinent *)objContinent{
    return [continentes removeObject:objContinent];
}

-(NSMutableArray *)getAll{
    return continentes;
}

@end

接下来我想用这样的“大陆”对象填充 *continents 属性。

OsContinents *continentesCollection = [[OsContinents alloc] init];
    for (NSString *strContinente in [data allKeys]) {
        OsContinent *con = [[OsContinent alloc] init];
        [con setContinente:strContinente];
            NSLog(@"%@",[con getContinente]);
        [continentesCollection add:con];
    }
    NSLog(@"%u",[continentesCollection count]);

但是在计数方法中总是得到零。

注意: NSLog(@"%@",[con getContinente]) print de data OK,Continent Object 是 OK,问题出在 Continents Object 里面的“*continentes”——

有什么线索吗?

4

1 回答 1

1

您的初始化程序除了初始化超类之外什么都不做。用它来设置你自己的类:

- (id)init
{
    self = [super init];
    if (self)
    {
        _continentes = [[NSMutableArray alloc] init];
    }
    return self;
}

否则,continentes会留下来nil。消息传递nil是有效的:方法根本不做任何事情,并返回 0。

如果您想完全隐藏底层的可变数组(这很好),那么不要在您的 .h 文件中将其作为属性宣传。相反,在你的开头@implementation,声明一个半私有的实例变量:

@implementation OsContinents
{
    NSMutableArray *_continentes;
}

我说“半私有”是因为您始终可以使用运行时引擎来内省对象。但它会被隐藏起来,无法正常使用。如果您曾经子类化您的对象,您总是可以将实例变量声明从您的移动@implementation到您的@interface,以便子类可以使用它。

于 2012-08-18T19:27:18.493 回答