2011-07-21 5 views
1

"addTarget:自己アクション:@セレクタ" :: NSArrayは動作しますが、ポインタはcallBackルーチンで失敗しますか?しかし、viewDidLoadからルーチンを呼び出すことは、NSArrayとポインタの両方で機能しますか? "addTarget:self action:@selector" callbackとは何が違うのですか?ここ"addTarget:自己アクション:@セレクタ" :: NSArrayは動作しますが、ポインタは失敗しますか?

コードスニペットです:探しのための

おかげで...

ファイル.h

NSArray *nsarrA; 
NSString **p_nssB; 

file.m

- (void)viewDidLoad { 
    nsarrA = [[NSArray alloc] initWithObjects:@"0",@"1",@"2",@"3",@"4",@"5",@"6",nil]; 

    p_nssB = (NSString**)malloc(10*sizeof(NSString*)); 
    for (int i=0; i<10; i++) { 
     p_nssB[i]=[NSString stringWithFormat:@"%d", i]; 
    } 

    [self viewMenu]; 
} 


- (void) viewMenu {  
    UIButton *uibtnMenu = [uibtnMenu addTarget:self action:@selector(actionMenu:) forControlEvents:UIControlEventTouchUpInside]; 
    [uiviewMenu addSubview:uibtnMenu]; 

    NSLog(@"nsarrA: %@ %@ %@", [nsarrA objectAtIndex:0], [nsarrA objectAtIndex:1], [nsarrA objectAtIndex:2]);//<--works 
    NSLog(@"p_nssB: %@ %@ %@", p_nssB[0], p_nssB[1], p_nssB[2]);//<--Works 
} 


- (void) actionMenu: (UIButton *) uibtnMenu{ 
    NSLog(@"nsarrA: %@ %@ %@", [nsarrA objectAtIndex:0], [nsarrA objectAtIndex:1], [nsarrA objectAtIndex:2]);//<--works 
    NSLog(@"p_nssB: %@ %@ %@", p_nssB[0], p_nssB[1], p_nssB[2]);//<--fails(drops out of App) 
} 

答えて

2

あなたは[NSStringのを割り当てるとstringWithFormat:]インスタンスがオートリリースされます。次のイベントサイクルまでにリリースされます。インスタンスを保持する必要があります。

だからどちらかの操作を行います。

[[NSString stringWithFormat:@"%d", i] retain]; 

か:あなたはfile.mオブジェクトを解放するとき

また
[[NSString alloc] initWithFormat:@"%d", i]; 

、あなたは何をする必要があります:

for (int i=0; i<10; i++) { 
    [p_nssB[i] release]; 
} 
+0

以上、 NSArrayを使用します。 C配列にオブジェクトを格納する場合は、オブジェクトのメモリが画像の外観を管理する方法や、ポインタが絡んでいるか、漏れてしまうかについて、非常に確かなアイデアが必要です。 – Chuck

+0

トーマスありがとう、私は私の問題を解決するためにあなたのソリューションを拡張することができました。 –

+0

@Chuck、どういう意味ですか?ポインタが漏れているのか、ぶら下がっていますか? –

関連する問題