2012-04-07 76 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方法(最後一點是有爭議的)。