注意:我没有使用ARC
我有一个带有以下属性的UILabel:@property (nonatomic, retain) UILabel *someLabel;
我正在尝试设置自定义setter。以下代码是否会导致泄漏,因为@property
实际上也在调用retain
?
- (void)setSomeLabel:(UILabel *)someLabel
{
if (someLabel != self.someLabel) {
[self.someLabel release];
self.someLabel = [someLabel retain];
}
// some custom code here
}
答案 0 :(得分:8)
注意:我没有使用ARC
你真的,真的应该。
你的二传手是一个无限循环。对self.someLabel = ...
的调用与[self setSomeLabel:...]
完全等效,导致循环。
正确的手动设定器如下所示:
- (void)setSomeLabel:(UILabel *)someLabel
{
[someLabel retain];
[_someLabel release];
_someLabel = someLabel;
// some custom code here
}
还有其他常见的模式。一个主要问题是,如果将对象重置为相同的值,是否应运行“某些自定义代码”。如果没有,那么这种模式更有意义:
- (void)setSomeLabel:(UILabel *)someLabel
{
if (someLabel != _someLabel) {
[_someLabel release];
_someLabel = [someLabel retain];
// some custom code here
}
}
答案 1 :(得分:6)
该代码会导致您的应用无限循环,因为使用self.someLabel
会导致调用方法setSomeLabel:
。
您可以尝试以下代码作为自定义设置器:
@synthesize someLabel = _someLabel;
- (void)setSomeLabel:(UILabel *)someLabel
{
if (someLabel != _someLabel)
{
[_someLabel release];
_someLabel = [someLabel retain];
}
// custom code
}
- (void)dealloc
{
[_someLabel release];
// ... other releases
[super dealloc];
}
答案 2 :(得分:0)
不,这完全没问题,因为你在这里使用自定义设置器。
@Property等同于声明访问器方法。
只有在未实现setter和/或getter的情况下,@ Synthesize才会根据属性声明属性生成访问器方法。
答案 3 :(得分:0)
我假设你没有使用ARC ......
你是正确的,你过度保留传入的someLabel,同时在属性上调用release也不是很好!
我会使用实例变量而不是属性:
- (void)setSomeLabel:(UILabel *)someLabel
{
if (someLabel != _someLabel) {
[_someLabel release];
_someLabel = [someLabel retain];
}
// some custom code here
}