gpt4 book ai didi

iphone - 模拟低内存警告时 NSArray 导致内存泄漏

转载 作者:行者123 更新时间:2023-11-28 18:44:41 32 4
gpt4 key购买 nike

我做了一个重现这个问题的示例项目,其中包含两个 View :

根 header :

#import <UIKit/UIKit.h>
#import "view2.h"

@interface RootViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>{
view2 *secondView;
UITableView *table;
NSArray *array;
}

@property (nonatomic, retain) view2 *secondView;
@property (nonatomic, retain) IBOutlet UITableView *table;
@property (nonatomic, retain) NSArray *array;
@end

根主要:

#import "RootViewController.h"

@implementation RootViewController
@synthesize table, array, secondView;

- (void)viewDidLoad
{
[super viewDidLoad];
if(self.array == nil){
self.array = [NSArray arrayWithObjects:@"1", @"2", @"3", @"4", nil];
}
}
- (void)didReceiveMemoryWarning
{
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];

}

- (void)viewDidUnload
{
[super viewDidUnload];
table = nil;
array = nil;
secondView = nil;

}

- (void)dealloc
{
[table release];
[array release];
[secondView release];
[super dealloc];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [array 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.text = [array objectAtIndex:indexPath.row];
return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

if (secondView == nil) {
secondView = [[view2 alloc] init];
}
[self.navigationController pushViewController:secondView animated:YES];
}
@end

view2 simple 包含一个带有文本“view 2”的标签,用于识别目的。所有这些代码在根 Controller 中所做的是创建一个值为 1、2、3、4 的数组并将此文本作为行绑定(bind)到表中,单击任何行将 View 2 插入堆栈。如果您使用泄漏工具工具在模拟器中加载应用程序,请单击任意行以显示 view2,然后模拟错误警告出现以下泄漏: image对于该行:

self.array = [NSArray arrayWithObjects:@"1", @"2", @"3", @"4", nil];

这给我的主应用程序带来了很多问题,因为我使用数组在各处的表格中提供数据。

我已经尝试过各种方法来解决这个问题,例如以不同的方式声明数组都无济于事。

非常感谢任何帮助!

谢谢

最佳答案

viewDidUnload 中,您混淆了属性与直接 ivar 访问。

array = nil 只是将 ivar 设置为 nil,而不使用合成访问器方法。您必须使用点符号:self.array = nil;

这种方式使用访问器 setArray: 来为您处理内存管理。

混合使用变量和属性是 Objective-C 初学者经常遇到的问题。通过始终对属性和 ivars 使用不同的名称,可以很容易地避免混淆:

@synthesize array = _array;

您可以在类的@interface 中省略ivar 声明,或将其命名为@synthesize 指令中的名称。

关于iphone - 模拟低内存警告时 NSArray 导致内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6150891/

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