我正在测试以下代码。 ffv在接口文件中声明。

ffv = [[FullFunctionView alloc] initWithFrame:self.view.bounds];
NSLog(@"%i", [ffv retainCount]);  // prints 1
[self.view insertSubview:ffv belowSubview:switchViewsBtn];
NSLog(@"%i", [ffv retainCount]);  // prints 2
[ffv release]; // you can release it now since the view has ownership of ffv
NSLog(@"%i", [ffv retainCount]);  // prints 1

if (ffv == nil)
    NSLog(@"ffv is nil");

// "ffv is nil" is not printed

[ffv testMethod]; // "test method called" is printed

这是我的[ffv testMethod]实现
- (void)testMethod
{
    NSLog(@"test method called");
}

在这种情况下,我得出的结论是,即使您释放保留计数为2的对象,您也会失去对该对象的所有权,但是引用仍然保留。

现在,我的问题是:
  • 我的推论正确吗?
  • 还有其他重要的可以推论的吗?
  • 仍然保留(使用)ffv并从ffv调用方法会导致哪些并发症? (我认为这是可以的,因为视图将始终拥有ffv,并且直到有人调用viewDidUnload才会释放它。只要我不将ffv的引用传递给其他对象即可。)
  • 最佳答案

    1)我的推论正确吗?

    您的推论是正确的。 Memory Management Programming Guide说明每个对象都有一个或多个所有者。您拥有使用以allocnewcopymutableCopy开头的任何方法创建的对象。您还可以使用保留来获得对象的所有权。完成对象处理后,必须使用releaseautorelease放弃所有权。

    释放对象不会更改引用该对象的任何变量的值。变量将包含对象的内存地址,直到您重新分配它为止,无论对象具有多少保留计数。即使对象的保留计数变为零,导致对象被释放,您的变量仍将指向相同的地址。如果在对象被释放后尝试访问它,则您的应用通常会崩溃,并显示EXC_BAD_ACCESS。这是一个常见的内存管理错误。

    2)可以从中得出其他重要的结论吗?

    什么都没想到。

    3)仍然保留(使用)ffv和从ffv调用方法会导致哪些复杂问题? (我认为这是可以的,因为视图将始终拥有ffv,并且直到有人调用viewDidUnload才会释放它。而且,只要我不将ffv的引用传递给其他对象即可。)

    调用release时,您在告诉Objective C运行时您不再需要访问该对象。尽管在许多情况下您都知道对象仍然存在,但实际上在调用release之后,您实际上不应该访问对象。您只是想吸引命运,并为将来的错误做好准备。

    我个人不喜欢用release语句添加代码,因为我不相信自己会100%地记住它们。相反,我更喜欢这样分配变量后立即自动释放变量:

    ffv = [[[FullFunctionView alloc] initWithFrame:self.view.bounds] autorelease];
    

    这样可以确保ffv至少存在到方法结束。此后不久,通常是在运行循环的下一次迭代之前,它将被释放。 (理论上,如果要在一个紧密的循环中分配大量的临时对象,这可能会消耗过多的内存,但是实际上,我从未遇到过这种情况。如果我这样做,将很容易进行优化。)

    关于iphone - Objective-C指针/内存管理问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6866324/

    10-11 03:13