ARC を使用して iOS 6.1 のコーディングを行っていますが、nsmutablearray 内のオブジェクトが「失われる」という問題があります。私はそれをより詳細に説明します:
- いくつかのオブジェクト(アドレス)を保持する必要がある NSMutableArray を持つ親ビューがあります
- ボタンを押すたびに、配列のデータが NSLog で表示され、ナビゲーション コントローラーが ChildView にプッシュします。
- 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