3

ARCを有効にしてiPhoneアプリケーションを作成していますが、この状況が発生しています。

アプリケーションの各ページで、Webサービス呼び出しが発生しています。このメソッドでは、サーバーから新しい値を追加する前に、配列からすべてのオブジェクトを削除しています。すべて正常に動作していますが、アプリがでクラッシュすることがあり[self.myArray removeAllObjects]ます。

myArrayに@propertyを設定しました@property (strong, nonatomic) NSMutableArray myArray;

私が考えているのは、ARCを使用しているため、myArrayある時点でオブジェクトが解放され、同じ配列からすべてのオブジェクトを削除しようとしているということです。それがクラッシュの原因であるかどうかはわかりませんが、他の理由はわかりません。

そこで、オブジェクトを削除する前に、配列が有効かどうかを確認することを考えていました。さまざまなシナリオを確認するためのサンプルコードを作成しました。ここにあります:

NSMutableArray *testArray = [[NSMutableArray alloc]initWithObjects:@"1", @"2", @"3", @"4", nil];

if (testArray) {
    NSLog(@"i am alive");
}

[testArray release];

if (testArray) { //here how to check whether this array is valid or not?
    NSLog(@"i am alive: %@", testArray);
}else{
    NSLog(@"I am dead");
    testArray = [[NSMutableArray alloc]initWithObjects:@"5", @"6", @"7", @"8", nil];
}

[testArray release];
[testArray removeAllObjects];

クラッシュの原因になることは承知していますが、確認用です。ここで、配列が有効かどうかを確認するにはどうすればよいですか?これは正しいアプローチですか、それとも他の何かですか?

案内してください。
ありがとう。

実際のコード:

- (void)getFriendsList{

    BOOL netIsAvailable = [self connected];

    if (netIsAvailable) {
        @try {
            NSString *accessToken = [self getAccessToken];
            NSString *tokenEncoded = [accessToken stringByReplacingOccurrencesOfString:@"\"" withString:@""];
            NSString *finalUrl = [NSString stringWithFormat:@"%@FriendsnSongs/%@",CommonWebServiceUrl,tokenEncoded];
            NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:finalUrl] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10];
            NSURLResponse *response = nil;
            NSError *error = nil;
            NSData *currentResult = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
//            NSString* responseString = [[NSString alloc] initWithData:currentResult encoding:NSUTF8StringEncoding];

            if (currentResult != nil) {
                NSDictionary* json = [NSJSONSerialization
                                      JSONObjectWithData:currentResult
                                      options:kNilOptions
                                      error:&error];
                NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
                int statusCode = [httpResponse statusCode];

                NSMutableArray *match = [json valueForKey:@"FriendsnSongsResult"];
                if (statusCode == 200) {
                    if (self.userGuidArray) {
                        [self.albumNameArray removeAllObjects];  //here got crash
                        [self.artistNameArray removeAllObjects];
                        [self.deviceNameArray removeAllObjects]; //here also got crash once
                        [self.nickNameArray removeAllObjects];
                        [self.userProfileImageArray removeAllObjects];
                        [self.songTitleArray removeAllObjects];
                        [self.songStatusArray removeAllObjects];
                        [self.userGuidArray removeAllObjects];
                    }

                    for(NSArray *player in match) {
                        [self.albumNameArray addObject:[(NSArray *)player valueForKey:@"AlbumName"]];
                        [self.artistNameArray addObject:[(NSArray *)player valueForKey:@"Artist"]];
                        [self.nickNameArray addObject:[(NSArray *)player valueForKey:@"NickName"]];
                        [self.userProfileImageArray addObject:[(NSArray *)player valueForKey:@"ProfileImage"]];
                        [self.songStatusArray addObject:[(NSArray *)player valueForKey:@"Status"]];
                        [self.songTitleArray addObject:[(NSArray *)player valueForKey:@"Title"]];
                        [self.userGuidArray addObject:[(NSArray *)player valueForKey:@"UserGuid"]];
                        [self.deviceNameArray addObject:[(NSArray *)player valueForKey:@"DeviceName"]];
                    }
                    //Start timer for updating the friends list
                    if (timerActivated)
                        [self performSelectorOnMainThread:@selector(backgroundFriendsListUpdate) withObject:nil waitUntilDone:NO];
                    //Update table if the table not in search mode
                    if (!isSearching)
                        [self performSelectorOnMainThread:@selector(updateTable) withObject:nil waitUntilDone:YES];
                }
            }
        }
        @catch (NSException *exception) {
            NSLog(@"Exception: %@",exception.name);
        }
    }
    [DejalActivityView removeView];
}

そして重要な点は、このクラスではバックグラウンドスレッドが30秒ごとに実行されていることです。テーブルを更新するためにこれと同じメソッドを呼び出します。

4

2 に答える 2

4

を使用している場合は、この行をコードからARC削除しください。それ以外の場合は、メソッドを書き込みます。[testArray release];ARC[testArray release];-(void)dealloc

配列値を削除する前に条件を指定してください

if(myArray.count > 0)// because sometime it is good logic for us.
  [myArray removeAllObjects];

次に、にデータを挿入しますmyArray

于 2013-03-19T09:33:56.463 に答える
1

コメントで示唆したように、一時配列を使用することをお勧めします。次のコードは一時配列を埋め、それを使用してメインスレッドの配列を置き換えます。

NSMutableArray *tempAlbumArray = [NSMutableArray array];
//fill your array
[tempAlbumArray addObject:<#some object#>];
dispatch_async(dispatch_get_main_queue(), ^{
    //replace your array with the new one
    //this code will be executed in main thread
    self.albumNameArray = tempAlbumArray;
});
于 2013-03-19T11:09:24.333 に答える