gpt4 book ai didi

ios - 使用[ self 释放]、[ self 保留]是好方法吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:16:04 25 4
gpt4 key购买 nike

我创建了 DownloadAndParseBook 类。在收到任何数据或网络错误之前,它不会自动更新。

我用的是[self release],[self retain]。使用[ self 释放]、[ self 保留]是好方法吗? DownloadAndParseBook 是否包含任何潜在的错误?

@implementation GetBooks

-(void) books
{
for(int i =0; i<10; i++)
{
DownloadAndParseBook *downloadAndParseBook =
[[[DownloadAndParseBook alloc] init]autorelease];
[downloadAndParseBook startLoadingBook];
}
}
@end


@implementation DownloadAndParseBook

- (id)initWithAbook:(int)bookID
{
if(self = [super init])
{
[self retain];
}
return self;
}

- (void)startLoadingBook
{
[NSURLConnection connectionWithRequest:request delegate:self];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
[self release];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
[self saveResultToDatabase];
[self release];
}


@end

最佳答案

self 保留偶尔是一种合适的模式。这种情况很少见,但有时在某些类型的多线程代码中,确保您不会在处理某些内容的过程中消失很重要。也就是说,这不是那些时代之一。我无法想象您当前的方法会有所帮助的情况。如果有人创建了您的对象,然后从不调用 startLoadingBook,那么它就会泄漏。如果有人调用 startLoadingBook,那么你的对象无论如何都会被保留,因为 NSURLConnection 会保留它的委托(delegate)直到它完成。

也就是说,我相信您的大部分问题都来自您的对象模型错误这一事实。 GetBooksDownloadAndParseBook 作为类都没有意义。您可能的意思是 BookManager(用于保存所有书籍的东西)和 BookDownloadController(用于管理单本书下载的东西)。 BookManager 应该跟踪所有当前的 BookDownloadControllers(在 NSSetNSArray ivar 中)。每个 BookDownloadController 都应该跟踪它的 NSURLConnection(在 ivar 中)。您不应该只是创建连接并让它们“卡在自己身上”(即 self 保留)。这样感觉很方便,但是却让后面的代码处理起来非常吃力。您无法控制要建立的连接数量。您无法取消连接。它很快就会变得一团糟。

关于ios - 使用[ self 释放]、[ self 保留]是好方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10089211/

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