应该在viewDidUnload中使用retain属性版本的视图控制器的var?
纵观苹果的ToolbarSearch例子,我看到他们的视图控制器的搜索栏变量有保有财产,它这样做:应该在viewDidUnload中使用retain属性版本的视图控制器的var?
searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0.0, 0.0, 400.0, 0.0)];
在控制器的dealloc中,搜索栏被释放。但是,它的viewDidUnload不会释放,只是将searchBar变量设置为零。
我以为alloc增加了保留计数,并且变量的retain属性额外增加了计数。如果这是真的,是不是意味着searchBar需要在viewDidUnload中发布?
乔伊 -
的“保留”合成属性的属性仅适用于当突变被调用。因此,如果一个外部类名为:
[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?
然而,其viewDidUnload不会释放,但只是将搜索栏变到零。
这是不正确的。该-viewDidUnload
方法,你指具有行:
self.searchBar = nil;
即通过nil
的引领者searchBar
性能,等同于:
[self setSearchBar:nil];
的retain
属性的setter发送release
到旧的价值和retain
到新的。
对,我错过了,但明白你的意思。我的困惑是,我认为分配,然后也设置searchBar等于结果导致两个保留计数增量,而属性设置为nil在viewDidUnload减少一个以上述方式。我*认为*平衡它将需要有一个autorelease的alloc,所以只有一个保留从设置searchBar等于alloc'ed搜索栏。我在这里错过了什么吗?当它首次分配它时,它与语法不是“self.searchBar =”有关吗? – Joey 2011-03-31 00:01:09
正如斯蒂芬的回答一样; 'searchBar ='正在设置一个ivar,而'self.searchBar ='正在向一个属性设置器发送消息,并且它们没有相同的行为。 – Jonah 2011-03-31 00:11:29
正是为了避免这种混淆,我认为,为ivars与属性建立略有不同的命名标准是一种好的做法。如果你有一个名为'searchBar'的属性,请确保其对应的ivar被称为'mSearchBar'或类似的东西。另外当然你需要确保你有一个“@synthesize searchBar = mSearchBar”。这种方式零混淆。 – 2011-06-22 06:38:10
我曾经想过(显然不正确)合成属性并将其设置为“保留”意味着当您将其设置为某物时,它会增加计数。这是当你做self.searchBar =东西?我认为这样做的意图是综合允许我使用equals语法而不是setVar语法。 – Joey 2011-03-30 23:51:15
@Joey:searchBar = something和self.searchBar =之间有很大区别。后者是调用增变器的语法缩写。它相当于[self setSearchBar:something];合成一个属性只是为你生成-searchBar和-setSearchBar方法。使用'retain'作为属性的属性将在您调用setter时添加一个保留到新对象的调用。所以self.searchBar =东西递增保留计数,而searchBar =东西没有。 – 2011-03-31 00:06:58