Objective-c NSMutableArray of Objects保留

时间:2012-02-08 21:25:06

标签: objective-c ios4 nsmutablearray retain

我无法得到它!我有自定义类“Word”,我只需几步就可以生成Word-class-objects的NSMutableArray:

  1. words = [NSMutableArray array];
  2. 表示i = 0到8
  3. word = alloc + init;
  4. [words addObject:word];
  5. [word release];
  6. 然后我将单词实例传递给另一个类的setter:

    someInstance.words = words;
    

    如果单词是非原子的,则保留属性。我声明了这样的setWords方法:

    -(void)setWords:(NSMutableArray *)w {
        [w retain];
        [words release];
        words = w;
    }
    

    当单词作为“w”变量来到方法时,它是一个对象数组但是当我保留它并分配给我的旧值时,我的单词变量变为NSMUtableArray并且它的计数等于w.count,但是数组的项目为0x0。 “=”运算符不会复制数组项,我该如何解决?请帮忙,我是objective-c的新手。 我只用一种方法实现Word,我实现无参数的init方法吗?

    -(id)initWithId:(int)Id Word:(NSString *)Word Card:(int)Card {
        self.id = Id;
        self.word = Word;
        self.card = Card;
        return self;
    }
    

    我生成NSMutableArray的循环:

    Card *card = [[Card alloc] initWithId:[s intForColumn:@"id"] Type:[s intForColumn:@"type"] Used:[s intForColumn:@"used"]];
    s = [db executeQueryWithFormat:@"SELECT w.id as id, word, card FROM word as w INNER JOIN card as c ON w.card=c.id WHERE c.id=%i ORDER BY w.id, RANDOM()", card.id];
    while ([s next]) {
        Word *word = [[Word alloc] initWithId:[s intForColumn:@"id"] Word:[s stringForColumn:@"word"] Card:[s intForColumn:@"card"]];
        [card.words addObject:word];
        [word release];
    }
    

1 个答案:

答案 0 :(得分:0)

您的代码存在许多问题。

  • 您需要遵循调用超级指定初始化程序并检查返回值的标准初始化模式。

  • 该方法应命名为initWithId:word:card:(即大小写错误,因此StackOverflow上的愚蠢着色,甚至)。

  • 如果您的setter / getter仅遵循标准模式,则无需实现自定义setter / getter。使用@property和@synthesize。

  • (从您的屏幕截图中)您真的不想直接从您的setter触发UI更新。一般来说,无论如何。通常,您希望视图层通过控件触发模型更新,并且在模型完全更新后,让视图层知道它应该重新加载。

  • 当您提到您正在实例化NSMutableArray实例时,您不会在代码中显示它。添加card.words个实例时,Word是否真的设置了?

显示-initWithId:card:type:used :(注意我更正了案例)方法的实现。

即。它最好有类似的东西:

 words = [NSMutableArray new]; // Or, if ARC, [NSMutableArray array];

好的 - 接下来......

  • assert(card.words);循环之前放置while() ...如果未设置words,则会爆炸。

  • 确保card是非零的(没有理由不应该......但是当明显的东西看起来正确时,你检查真的明显接下来的事情)

关于-reloadData的评论更多的是你想要reloadData在首先触发加载的任何内容。想象一下,在更新整个UI之前,您正在加载几种不同类型的数据;也许表格视图必须重新加载其他一些东西需要围绕它更新。通过将reloadData移出setter,它(a)使得setter变得简单且不令人惊讶,而(b)可以更容易地重构UI层,从而可以同时完成多UI元素更新。 p>

(另外 - 请不要严厉对待编码风格的评论......并不意味着...... Obj-C编码有一些微妙但通用的模式。如果你学习并使用它们,它会让你的生活变得更轻松。我们都是Obj-C的新手。只是我们中的一些人是新手,而你的其他人甚至还没有出生。;)。