1

ARCにいくつか問題があります。 ScrollViewに複数のビューを追加しようとしています。その後、ユーザーが1つのビューをタップするとアクションが呼び出されます。ARC - 複数のサブビューを挿入して操作を処理する

しかし、ユーザーがビューをタップすると、私はこのメッセージが表示されます:「割り当て解除インスタンスに送信されたメッセージ」

がどのように私は、ビューを保持することができますか?

これはViewControllerをで私のコードです:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view from its nib. 
    int i; 
    for (i=0;i<10;i++) { 
     ChannelViewController *channelView = [[ChannelViewController alloc] init]; 
     [channelView.view setFrame:CGRectMake(i*175, 0, 175, 175)]; 
     //channelsScrollView is a ScrollView 
     [self.channelsScrollView addSubview:channelView.view]; 
    } 
    [self.channelsScrollView setContentSize:CGSizeMake(i*175, 175)]; 
} 

答えて

2

あなたはViewControllerを内のすべてのChannelViewControllerインスタンスへの参照を保持する必要があります。あなたのコードでは、各forループの繰り返しの後、ARCはあなたのChannelViewControllerインスタンスを解放します。これを避ける最も簡単な方法は、ViewControllerで配列プロパティを準備することです。

// In ViewController.h 
@property (nonatomic, retain) NSMutableArray * channelViews; 

// In ViewController.m 
@synthesize channelViews; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.channelViews = [[NSMutableArray alloc] initWithCapacity:10]; 

    // Do any additional setup after loading the view from its nib. 
    int i; 
    for (i=0;i<10;i++) { 
     ChannelViewController *channelView = [[ChannelViewController alloc] init]; 
     [channelView.view setFrame:CGRectMake(i*175, 0, 175, 175)]; 
     //channelsScrollView is a ScrollView 
     [self.channelsScrollView addSubview:channelView.view]; 
     [self.channelViews addObject:channelView];  // <-- Add channelView to the array 
    } 
    [self.channelsScrollView setContentSize:CGSizeMake(i*175, 175)]; 
} 
+0

私は同様のものを見ていますが、なぜこれが必要なのか分かりません。 Kazukiは '[self.channelsScrollView addSubview:channelView.view]'を呼び出すので、 'self.channelsScrollView'は' channelView.view'への参照を保持します。 UIView自体のコントローラへの参照を保持していませんか?それは奇妙に思える。 –

+0

UIViewが内部的にUIViewControllerへの参照を保持しているかどうかはわかりませんが、たとえそれがあっても、保持サイクルを避けるために弱い参照にする必要があります。 – barley

+0

ああ、良い点、ありがとう。 –

関連する問題