Objective c 为什么这个GCD示例代码似乎不正确地释放了一个对象?
在author hasObjective c 为什么这个GCD示例代码似乎不正确地释放了一个对象?,objective-c,multithreading,memory-management,grand-central-dispatch,Objective C,Multithreading,Memory Management,Grand Central Dispatch,在author hasreleased中,当对象未被分配、复制或保留时,对象的状态为stats。这是个错误还是我不明白 - (IBAction)analyzeDocument:(NSButton *)sender { dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSDictionary *stats = [myDoc analyze]; dispatch_async(dispatch_get_main_queue(),
release
d中,当对象未被分配、复制或保留时,对象的状态为stats
。这是个错误还是我不明白
- (IBAction)analyzeDocument:(NSButton *)sender
{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSDictionary *stats = [myDoc analyze];
dispatch_async(dispatch_get_main_queue(), ^{
[myModel setDict:stats];
[myStatsView setNeedsDisplay:YES];
[stats release];
});
});
}
analyze
将对象的所有权返回给调用者,这可能是一个错误,也可能是正确记录的。如果发布stats
不是一个错误,那么代码示例使用的约定与所有权不符
内存管理规则,有时称为所有权
策略,帮助您显式管理Objective-C代码中的内存
通过为创建的对象分配内存或进行复制,您可以拥有该对象
它相关方法:alloc,allocWithZone:,copy,copyWithZone:, mutableCopy,mutableCopyWithZone:
另一个应该返回所有权的前缀是class方法
+new
。例如,[MyDocClass newAnalysis]代码>如果analyze
将对象的所有权返回给调用者,则可能是一个错误,或者是有适当的文档记录。如果发布stats
不是一个错误,那么代码示例使用的约定与所有权不符
内存管理规则,有时称为所有权
策略,帮助您显式管理Objective-C代码中的内存
通过为创建的对象分配内存或进行复制,您可以拥有该对象
它
相关方法:alloc,allocWithZone:,copy,copyWithZone:,
mutableCopy,mutableCopyWithZone:
另一个应该返回所有权的前缀是class方法+new
。例如,[MyDocClass newAnalysis]代码>这只是一个示例,演示了GCD如何轻松地将长期运行的任务放到后台,但是,是的,它有两个问题之一,一个是过时的约定,另一个是实际错误
虚构的analyze
方法可能返回一个拥有的引用。这违反了Cocoa约定,即未命名为new
、alloc
、release
、或copy…
的方法通常不返回此类引用,但如果文档明确指出它确实返回了,并且确实没有办法避免,则可以。在这种情况下,需要将release
发送到stats
,以避免内存泄漏。(如果这是真实的代码,那么重命名该方法将是一个好主意,也许可以使用CoreFoundation中使用的create
,表示返回所属引用。)
但是,如果analyze
遵循惯例并返回一个非自有的引用,那么您是对的,将release
发送到stats
是不正确的,最终会导致崩溃。这只是一个示例,演示GCD如何轻松地将长期运行的任务放到后台,但是,是的,它有两个问题之一,一个是过时的约定,另一个是实际的错误
虚构的analyze
方法可能返回一个拥有的引用。这违反了Cocoa约定,即未命名为new
、alloc
、release
、或copy…
的方法通常不返回此类引用,但如果文档明确指出它确实返回了,并且确实没有办法避免,则可以。在这种情况下,需要将release
发送到stats
,以避免内存泄漏。(如果这是真实的代码,那么重命名该方法将是一个好主意,也许可以使用CoreFoundation中使用的create
,表示返回所属引用。)
但是,如果analyze
遵循约定并返回非自有引用,那么您是对的,将release
发送到stats
是不正确的,最终会导致崩溃。最有可能的analyze
是返回保留计数为1的词典,这就是为什么需要release
的原因。最有可能的analyze
是返回保留计数为1的词典,这就是需要发布