2011-03-30 40 views
0

纵观苹果的ToolbarSearch例子,我看到他们的视图控制器的搜索栏变量有保有财产,它这样做:应该在viewDidUnload中使用retain属性版本的视图控制器的var?

searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0.0, 0.0, 400.0, 0.0)]; 

在控制器的dealloc中,搜索栏被释放。但是,它的viewDidUnload不会释放,只是将searchBar变量设置为零。

我以为alloc增加了保留计数,并且变量的retain属性额外增加了计数。如果这是真的,是不是意味着searchBar需要在viewDidUnload中发布?

回答

1

乔伊 -

的“保留”合成属性的属性仅适用于当突变被调用。因此,如果一个外部类名为:

[viewController setSearchBar:mySearchBar]; 

viewController将在mySearchBar上调用retain。由于

searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0.0, 0.0, 400.0, 0.0)]; 

不经过突变(它只是直接修改实例变量搜索栏),那里只是一个对象(从ALLOC)之一的保留计数。

因此,示例中的保留/释放计数是正确的。来自alloc的+1,从dealloc的实现中释放-1。

如果你感到困惑-viewDidUnload和-dealloc之间的区别,这里有一个很好的解释:What exactly must I do in viewDidUnload?

+0

我曾经想过(显然不正确)合成属性并将其设置为“保留”意味着当您将其设置为某物时,它会增加计数。这是当你做self.searchBar =东西?我认为这样做的意图是综合允许我使用equals语法而不是setVar语法。 – Joey 2011-03-30 23:51:15

+0

@Joey:searchBar = something和self.searchBar =之间有很大区别。后者是调用增变器的语法缩写。它相当于[self setSearchBar:something];合成一个属性只是为你生成-searchBar和-setSearchBar方法。使用'retain'作为属性的属性将在您调用setter时添加一个保留到新对象的调用。所以self.searchBar =东西递增保留计数,而searchBar =东西没有。 – 2011-03-31 00:06:58

1

然而,其viewDidUnload不会释放,但只是将搜索栏变到零。

这是不正确的。该-viewDidUnload方法,你指具有行:

self.searchBar = nil; 

即通过nil的引领者searchBar性能,等同于:

[self setSearchBar:nil]; 

retain属性的setter发送release到旧的价值和retain到新的。

+0

对,我错过了,但明白你的意思。我的困惑是,我认为分配,然后也设置searchBar等于结果导致两个保留计数增量,而属性设置为nil在viewDidUnload减少一个以上述方式。我*认为*平衡它将需要有一个autorelease的alloc,所以只有一个保留从设置searchBar等于alloc'ed搜索栏。我在这里错过了什么吗?当它首次分配它时,它与语法不是“self.searchBar =”有关吗? – Joey 2011-03-31 00:01:09

+0

正如斯蒂芬的回答一样; 'searchBar ='正在设置一个ivar,而'self.searchBar ='正在向一个属性设置器发送消息,并且它们没有相同的行为。 – Jonah 2011-03-31 00:11:29

+0

正是为了避免这种混淆,我认为,为ivars与属性建立略有不同的命名标准是一种好的做法。如果你有一个名为'searchBar'的属性,请确保其对应的ivar被称为'mSearchBar'或类似的东西。另外当然你需要确保你有一个“@synthesize searchBar = mSearchBar”。这种方式零混淆。 – 2011-06-22 06:38:10

相关问题