填充nsmutablearray目标-c

时间:2012-04-07 07:26:33

标签: objective-c nsmutablearray nsarray nspredicate

有人可以解释一下填写myStrings数组的以下代码片段之间的区别:

    NSString *match = @"ad*.png";

    NSString *bundleRoot = [[NSBundle mainBundle] bundlePath];
    NSFileManager *fm = [NSFileManager defaultManager];
    NSArray *dirContents = [fm contentsOfDirectoryAtPath:bundleRoot error:nil];
    NSPredicate *fltr = [NSPredicate predicateWithFormat:@"SELF like %@", match];

    NSArray *onlyPNGs = [dirContents filteredArrayUsingPredicate:fltr];

    myStrings = [NSMutableArray array];
    for(int i=0;i<[onlyPNGs count];i++)
    {
        [myStrings addObject:(NSString *)[onlyPNGs objectAtIndex:i]];
    }
    NSLog([myStrings description]);

当我以这种方式填充我的数组时,在构造函数之后,myStrings以某种方式变为null,而不是填充过滤器,如果我手动添加项目,那么很好:

     [myStrings addObject:@"adburgerking1.png"];
    [myStrings addObject:@"adburgerking2.png"];
    [myStrings addObject:@"adburgerking3.png"];
    [myStrings addObject:@"addominos1.png"];
    [myStrings addObject:@"admcdonalds1.png"];
    [myStrings addObject:@"admcdonalds2.png"];
    [myStrings addObject:@"admcdonalds3.png"];
    [myStrings addObject:@"admeshuriskender1.png"];
    [myStrings addObject:@"adquickchina1.png"];
    [myStrings addObject:@"adsencam1.png"];
    [myStrings addObject:@"adsultanahmetkoftecisi1.png"];

提前致谢!!!

1 个答案:

答案 0 :(得分:3)

从您的第一条评论开始:myStrings是一个具有retain语义的属性 - 如果您作为属性(self.myStrings = ...)访问,属性将仅保留一个值,如果您直接指定给基础变量(myStrings = ...)将没有保留。

从您的第二条评论开始:[[NSMutableArray alloc] init][NSMutableArray array] - [[NSMutableArray alloc] init]会返回您拥有的数组,但您不会retain保留它;但[NSMutableArray array]会返回您不拥有的数组,如果您希望保留它,则必须retain

所以你需要的是:

self.myStrings = [NSMutableArray array];

RHS会返回一个你不拥有的数组,LHS会retain它 - 现在它会一直存在。

您可能想要使用:

myStrings = [[NSMutableArray alloc] init];

当RHS返回您拥有的数组时,LHS只会将存储在中,而不会保留它,因为您正在访问变量而不是属性。但是,此版本不会release myStrings引用的任何先前数组,因此通常不起作用。

规则始终使用点表示法访问属性,可能除了类initdealloc方法之外(最后一点是有争议的)。