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秒ごとに実行されていることです。テーブルを更新するためにこれと同じメソッドを呼び出します。