2012-04-07 66 views
1

可以请人给我解释一下下面的代码片段之间的差异来填充myStrings阵列:灌装NSMutableArray的Objective-C的

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成为空莫名其妙,但而不是填充过滤器,如果我手动添加项目everythings罚款:

 [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"]; 

在此先感谢!

+0

出于好奇,什么样的变量是'myStrings'?它只是一个普通的伊娃,还是它的财产?如果它是一个财产,你使用ARC?如果您使用的是ARC,请确保属性类型是STRONG或COPY,否则它将被释放并且无效。 – Malaxeur 2012-04-07 07:57:41

+0

即时通讯编程相当新,但即时通讯尝试将文件名称存储为NSString *。在头文件中: @property(nonatomic,retain)NSMutableArray * myStrings; – dramaticlook 2012-04-07 09:17:52

+0

你可能有一个局部变量,也称为'myStrings',它隐藏了实例变量? – 2012-04-07 09:33:16

回答

3

从你的第一个评论:myStringsretain语义属性 - 如果作为一个属性(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]初始化]。

作为RHS返回一个您拥有的数组,并且LHS只是将其存储起来没有在您访问变量而不是属性时保留它。然而,这个版本不会release任何以前由myStrings引用的数组,因此一般不起作用。

该规则总是使用点符号访问属性,可能例外的是类initdealloc方法(最后一点是有争议的)。