gpt4 book ai didi

iphone - 如何在for循环中释放一个对象?

转载 作者:可可西里 更新时间:2023-11-01 03:28:15 24 4
gpt4 key购买 nike

我是 cocoa/objective-c 的新手,我正在为我的对象的发布而苦苦挣扎。我有以下代码:

gastroCategoryList = [[NSMutableArray alloc] init];
for (NSDictionary *gastrocategory in gastrocategories) {
NSString *oid = [gastrocategory objectForKey:@"id"];
GastroCategory *gc = [[GastroCategory alloc] initWithId:[oid intValue] name:[gastrocategory objectForKey:@"name"]];
[gastroCategoryList addObject:gc];
}

分析器告诉我,for 中定义的“gastrocategory”是潜在的内存泄漏。但是我不确定我是否可以在 for 循环结束时释放它?

同样在下面的代码中:

- (NSArray *)eventsForStage:(int)stageId {

NSMutableArray *result = [[NSMutableArray alloc] init];

for (Event *e in eventList) {
if ([e stageId] == stageId) {
[result addObject:e];
}
}

return result;
}

分析器告诉我,我的“结果”是潜在的泄漏。但是我应该在哪里发布呢?

当我应该在@property 中使用分配、复制、保留等时,是否还有一个简单的规则需要记住?

另一个问题:

- (IBAction)showHungryView:(id)sender {
GastroCategoriesView *gastroCategoriesView = [[GastroCategoriesView alloc] initWithNibName:@"GastroCategoriesView" bundle:nil];

[gastroCategoriesView setDataManager:dataManager];

UIView *currentView = [self view];
UIView *window = [currentView superview];

UIView *gastroView = [gastroCategoriesView view];

[window addSubview:gastroView];

CGRect pageFrame = currentView.frame;
CGFloat pageWidth = pageFrame.size.width;
gastroView.frame = CGRectOffset(pageFrame,pageWidth,0);

[UIView beginAnimations:nil context:NULL];
currentView.frame = CGRectOffset(pageFrame,-pageWidth,0);
gastroView.frame = pageFrame;
[UIView commitAnimations];

//[gastroCategoriesView release];
}

我不明白,“gastroCategoriesView”是一个潜在的泄漏。我试图在最后或使用 autorelease 释放它,但都没有正常工作。每次我调用我的应用程序终止的方法。再次感谢您!

最佳答案

在你的循环中,将每个 gc 添加到列表后释放它,因为你不再需要它在你的循环范围内:

gastroCategoryList = [[NSMutableArray alloc] init];
for (NSDictionary *gastrocategory in gastrocategories) {
NSString *oid = [gastrocategory objectForKey:@"id"];
GastroCategory *gc = [[GastroCategory alloc] initWithId:[oid intValue] name:[gastrocategory objectForKey:@"name"]];
[gastroCategoryList addObject:gc];
[gc release];
}

在您的方法中,声明要自动释放的result 以从您的方法中解除对它的所有权:

NSMutableArray *result = [[[NSMutableArray alloc] init] autorelease];

// An alternative to the above, produces an empty autoreleased array
NSMutableArray *result = [NSMutableArray array];

编辑:在您的第三期中,您无法释放 View Controller ,因为它的 View 正在被窗口使用。将其设置为自动释放也会导致相同的命运,只是延迟了。

您必须在某处保留您的 GastroCategoriesView Controller ,例如在您的应用程序委托(delegate)的实例变量中。

关于iphone - 如何在for循环中释放一个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5410254/

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