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 が何らかの形で 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"];

前もって感謝します!!!

4

1 に答える 1

3

最初のコメントから:myStringsretainセマンティクスを持つプロパティです-プロパティは、プロパティ(self.myStrings = ...)としてアクセスされた場合にのみ値を保持します。基になる変数()に直接割り当てた場合myStrings = ...、保持はありません。

2番目のコメントから:[[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ないため、一般的には機能しません。

initルールは、クラスとメソッドを除いて、常にドット表記を使用してプロパティにアクセスしますdealloc(この最後のビットについては議論されています)。

于 2012-04-07T11:28:20.740 に答える