1

有人可以解释一下以下用于填充 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 以某种方式变为空,但不是用过滤器填充,如果我手动添加项目一切都很好:

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

提前致谢!!!

4

1 回答 1

3

从您的第一条评论来看:myStrings是具有retain语义的属性 - 如果作为属性 ( self.myStrings = ...) 访问,属性将仅保留值,如果您直接分配给基础变量 ( myStrings = ...),则不会保留。

从您的第二条评论中:[[NSMutableArray alloc] init]vs. [NSMutableArray array]-[[NSMutableArray alloc] init]返回您拥有的数组,您不需要retain保留它;但是[NSMutableArray array]返回一个您不拥有的数组,retain如果您想保留它,则必须使用它。

所以你需要的是:

self.myStrings = [NSMutableArray array];

RHS 返回一个您不拥有的数组,LHS 将返回retain- 现在它将保留。

您可能很想使用:

myStrings = [[NSMutableArray alloc] init];

因为 RHS 返回一个您拥有的数组,而 LHS 只是存储它而不保留它,因为您正在访问变量而不是属性。但是,此版本不会release引用任何以前的数组,myStrings因此通常无法正常工作。

The rule is always access a property using dot notation, with the possible exception of a classes init and dealloc methods (this last bit is debated).

于 2012-04-07T11:28:20.740 回答