gpt4 book ai didi

objective-c - 有人可以向我解释为什么我在以下代码段中“需要”一个保留语句吗?

转载 作者:行者123 更新时间:2023-12-01 19:25:55 25 4
gpt4 key购买 nike

我认为在整个过程中学习以及以下代码段对我来说不是很清楚。我知道alloc语句会增加保留计数,但是iOS开发的某些方面仍然让我感到困惑。

为什么在以下代码段中需要一个:[jokesArray retain];

我有一个jokesArray = [[NSArray alloc]init];,我所阅读的内容足以保留吗?

有人可以以一种易于理解的方式解释为什么需要该保留声明吗? (否则,该应用程序将因EXC_Bad_Access崩溃。

我有一些善良的人试图解释,但没有奏效。任何帮助将不胜感激。

#import "JokesViewController.h"


@implementation JokesViewController

- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:style];
if (self) {
// Custom initialization
}
return self;
}

- (void)dealloc
{
[super dealloc];
}

- (void)didReceiveMemoryWarning
{
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];

// Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{

[super viewDidLoad];

jokesArray = [[NSArray alloc]init];

[self getJokes];
}

- (void)viewDidUnload
{
[super viewDidUnload];
[jokesArray release];

}


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{

// Return the number of rows in the section.
return [jokesArray count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}





[[cell textLabel]setText:[[jokesArray objectAtIndex:0]objectForKey:@"text"]];

// [[cell textLabel]setText:@"ok"];

return cell;
}

#pragma mark - Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
// Navigation logic may go here. Create and push another view controller.
}


#pragma mark - Custom Functions

-(void) getJokes
{
NSURL *url = [NSURL URLWithString:@"someurl"];
__block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setCompletionBlock:^{
// Use when fetching text data
NSString *responseString = [request responseString];

NSDictionary *resultsDictionary = [responseString objectFromJSONString];
jokesArray = [resultsDictionary allValues];

[jokesArray retain]; //WHY DO I NEED THIS?


[self.tableView reloadData];

NSLog(@"%@", [jokesArray description]);

// Use when fetching binary data
// NSData *responseData = [request responseData];
}];
[request setFailedBlock:^{
NSError *error = [request error];

}];
[request startAsynchronous];
}

@end

最佳答案

您正在泄漏先前的NSArray分配,因为在代码的这一部分中:

 NSDictionary *resultsDictionary = [responseString objectFromJSONString];
jokesArray = [resultsDictionary allValues];

[jokesArray retain];

您正在创建一个NSDictionary,并替换所有的jokesArray指向您刚创建的NSDictionary的数据。
NSDictionary返回的数据也是使用便捷的初始化方法创建的,这意味着一段时间后它将被释放,这就是您需要保留的原因。

由于直接修改jokesArray变量,因此用新对象替换之前分配的NSArray不会被释放。

关于objective-c - 有人可以向我解释为什么我在以下代码段中“需要”一个保留语句吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7707749/

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