0

と呼ばれるメソッドがありgetProjectsます。私の方法では、jsonからのデータを解析します。nameプロジェクトのとidをインスタンス変数に保存します。projectsArrayこれはNSMutableArray。です。

問題は、ボタン(IBAction)が呼び出されwriteFile、クリック時に配列をログに記録しようとすると、アプリがクラッシュすることです。エラーメッセージはESC_BAD_ACCESSです。しかし、なぜ?ARCを使用しています。 `Method getProjects

- (void)getProjects {
int count = 0;
self.projectsArray      = [NSMutableArray arrayWithCapacity:10];
SBJsonParser *parser    = [[SBJsonParser alloc] init];

NSURLRequest *request   = [NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@projects.json", urlPath]]];
NSData *response        = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

NSString *json_string   = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];
NSArray *projects       = [parser objectWithString:json_string error:nil];

for (NSDictionary *project in projects) {
    NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:2];

    [dict setObject:[project objectForKey:@"name"] forKey:@"name"];
    [dict setObject:[project objectForKey:@"id"] forKey:@"id"];

    [self.projectsArray insertObject:dict atIndex:count];
    [self.selectProject addItemWithTitle:[project objectForKey:@"name"]];
    count++;
}

}

そして、私はでメソッドを呼び出しますapplicationDidFinishLaunching

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    [self getProjects];
    NSLog(@"%@", self.projectsArray);
}

applicationDidFinishLaunchingのログは、配列を返します。

4

1 に答える 1

0

さて、あなたはすでに問題の原因を見つけたようです:

割り当てを保持に変更しましたが、機能するようになりました。しかし、なぜ?

その理由は、プロパティをとして宣言することにより、assign設定時にその値が保持されないためです。

それで:

  1. 次のように配列を作成します。

      self.projectsArray      = [NSMutableArray arrayWithCapacity:10];
    
  2. arraywithCapacity自動解放されたオブジェクトを提供します。

  3. オブジェクトをプロパティに割り当てるときに、オブジェクトは保持されません。

  4. ある時点で、NSLogが実行される前に、オブジェクトの割り当てが解除されます。

  5. クラッシュ。

于 2012-08-04T14:38:17.827 に答える