内存管理分配而不直接分配

时间:2011-10-27 02:05:16

标签: objective-c memory-management assign

假设我在.h中声明了UIView viewLoading。我不直接初始化它(在第一个代码中)。

第一个代码。

 UIView *viewLoading2 = [[[UIView alloc] initWithFrame:CGRectMake(75 , 155, 170.0, 170.0)]];
 viewLoading = viewLoading2;
 [viewLoading2 release]

第二个代码:

viewLoading = [[[UIView alloc] initWithFrame:CGRectMake(75 , 155, 170.0, 170.0)]];

第三条守则:

- (void) viewLoad:(UIView *) viewLoading2
{
  viewLoading = viewLoading2;
  //do i need to retain, alloc, or release something here?

}
  1. 2在第一个代码中,我是否需要在dealloc中释放viewLoading?如果我不申报其财产会怎样?

  2. 在第二个代码中,它与第一个代码有相同的效果吗? (需要dealloc与否)。

  3. 对于第三个代码,它与第一个代码有相同的效果吗?我编码之后该怎么办? (见评论)

  4. iPhone代码是否总是需要释放在.h中声明的变量?或者只有在.h中声明的变量被分配?如果喜欢在第一个代码中,我是否需要dealloc viewLoading?

  5. 之间有什么不同

    self.viewloading = viewLoading2;

  6. viewloading = viewLoading2; 
    

    由于

1 个答案:

答案 0 :(得分:3)

在第一个示例中,您分配了对象(一次),然后释放它(一次),因此您不需要执行任何其他操作。另一方面,只要将发布版本发送到viewLoading2,viewLoading就无效,因此代码不是很有用。

在第二种情况下,你还没有发布viewLoading,所以最终确实需要这样做。

在第三个中,无论分配通过参数传递给此方法的对象的代码都负责释放它。它应该在此方法的持续时间内有效,但如果您将其保存以供以后使用,则需要将其保留在此处,然后在完成后将其释放。

编辑:

我不确定我理解你的问题4.接口(.h)文件中的声明只是为指针保留空间。它不是对象声明,因此在您实际进行对象分配之前不需要释放。

self.viewloading = viewLoading2正在使用属性setter方法进行分配。如果@property语句中包含“retain”,则保留将作为该赋值的一部分完成。 `viewloading = viewLoading2“是一个直接的赋值,没有保留。