gpt4 book ai didi

iphone - 如何使用 ARC 处理 iOS 中的自动释放对象

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:23:08 25 4
gpt4 key购买 nike

我正在创建一个启用了 ARC 的 iPhone 应用程序,我遇到了这种情况。

在应用程序的每个页面中,都会发生一个 Web 服务调用。在这种方法中,我在从服务器添加新值之前从数组中删除所有对象。一切正常,但有时应用程序在 [self.myArray removeAllObjects] 处崩溃。

我已经为 myArray @property (strong, nonatomic) NSMutableArray myArray; 设置了@property;

我的想法是,当我使用 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 秒运行一次。它将调用相同的方法来刷新表格。

最佳答案

如果您使用的是 ARC,那么请从您的代码中删除 [testArray release]; 这一行,因为 ARC 会处理它。否则[testArray release];写在-(void)dealloc方法中。

删除数组值前给出条件

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

然后在myArray中插入数据。

关于iphone - 如何使用 ARC 处理 iOS 中的自动释放对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15495573/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com