0

ARC を使用して iOS 6.1 のコーディングを行っていますが、nsmutablearray 内のオブジェクトが「失われる」という問題があります。私はそれをより詳細に説明します:

  1. いくつかのオブジェクト(アドレス)を保持する必要がある NSMutableArray を持つ親ビューがあります
  2. ボタンを押すたびに、配列のデータが NSLog で表示され、ナビゲーション コントローラーが ChildView にプッシュします。
  3. childview は新しいアドレス オブジェクトを生成します

これを行ってからビューの戻るボタンを押して同じケースを試したい場合 (もう一度ボタンを押すと)、配列内のデータが失われ、EXC_BAD_ACCESS が返されます。

私の仮定:parentView ARCに戻ると、2番目のビューとその中のすべての割り当てが解除されます。しかし、このオブジェクトの ARC カウンターが 0 にならないように、私の Address オブジェクトは配列から参照されます。

誰でも私を助けることができますか?ここに具体的なコードがあります

ParentViews コントローラ h:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
@property (nonatomic, strong) NSMutableArray *adresses;
@property int count;
-(void)goFurther;
@end

ParentViews コントローラ m:

#import "ViewController.h"
#import "SecondViewController.h"
#import "Address.h"

@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad
{
    self.title=@"First View";
    UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithTitle:@"Add address" style:UIBarButtonItemStylePlain
                                                                 target:self action:@selector(goFurther)];
    [self.navigationItem setLeftBarButtonItem:addButton];
    self.adresses=[[NSMutableArray alloc] init];
    self.count=0;
    [super viewDidLoad];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

-(void) goFurther{
    for (Address *a in self.adresses) {
        NSLog(@"Adresse:");
        NSLog(a.street);
        NSLog(a.door);
    }
    self.count++;
    SecondViewController *second=[[SecondViewController alloc]initWithView:self];

   [self.navigationController pushViewController:second animated:true];
}

@end

ChildViews コントローラ h:

#import <UIKit/UIKit.h>
#import "ViewController.h"

@interface SecondViewController : UIViewController
@property ViewController * viewCon;
-(id) initWithView: (ViewController*) view;
@end

ChildViews コントローラ m:

#import "SecondViewController.h"
#import "Address.h"

@interface SecondViewController ()

@end

@implementation SecondViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

-(id) initWithView: (ViewController*) view{
    self = [super init];
    self.viewCon=view;
    Address *a=[Address alloc];
    a.street=[NSString stringWithFormat:@"Street %d", self.viewCon.count];
    a.door=@"Door";
    [self.viewCon.adresses addObject: a];
    return self;
}

- (void)viewDidLoad
{
    self.title=@"Second View";
    [super viewDidLoad];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
4

1 に答える 1