Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 为什么这个GCD示例代码似乎不正确地释放了一个对象?_Objective C_Multithreading_Memory Management_Grand Central Dispatch - Fatal编程技术网

Objective c 为什么这个GCD示例代码似乎不正确地释放了一个对象?

Objective 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(),

在author has
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的词典,这就是需要发布