@property (retain, nonatomic) UILabel *showTime;
@sythesize showTime;
showTime = [[UILabel alloc] initWithFrame:CGRectMake(45, 4, 200, 36)];
[self.showTime setText:[NSString stringWithFormat:@"%d", time]];
[self.showTime setFont:[UIFont fontWithName:@"HelveticaRoundedLT-Bold" size:23]];
[self.showTime setTextColor:numColor];
self.showTime.backgroundColor = [UIColor clearColor];
[self addSubview:self.showTime];
[showTime release];
这是我目前的做法,对于UILabel,UIButton,UIImageView等... [Alloc init]它没有自我。因为我知道这将保留两次.. 但在分配之后,我放回了“自我”。设置属性..
我的直觉告诉我,我做错了,但它表面上看起来很好,我发现分析和仪器没有内存泄漏......有人可以给我建议吗?当我使用“自我”。设置文本和设置背景颜色,它会自动保留一个吗?太多了!
答案 0 :(得分:1)
实际上,如果您将属性赋予任何元素,那么这意味着,您为该元素提供了一个自动的getter / setter。
@property (retain, nonatomic) UILabel *showTime;
@synthesize showTime;
现在,您必须使用self初始化元素才能访问这些getter / setter。
因此,总是这样做,
self.showTime = [[UILabel alloc] initWithFrame:CGRectMake(45, 4, 200, 36)];
您要保留两次,因此请将已分配的对象保持在自动释放模式。
self.showTime = [[[UILabel alloc] initWithFrame:CGRectMake(45, 4, 200, 36)] autorelease];
现在,当您想要获取对象时,例如提供值或更改背景颜色等,
[self.showTime setText:[NSString stringWithFormat:@"%d", time]];
OR
[showTime setText:[NSString stringWithFormat:@"%d", time]];
一切都会好的。
但是,在DEALLOC部分,你再次需要自己设置为零。
self.showTime = nil;
实际上,retain属性会生成一个setter方法,如下所示。
- (void)setShowTime:(UILabel *)label {
if (showTime != label) {
[showTime release];
showTime = [label retain];
}
}
因此,当我们处理内存更改,即ALLOCation或Deallocation时,请使用SELF。
然而,这是我对自我用法的理解。任何其他想法,总是欢迎!
希望它有帮助!!!!
答案 1 :(得分:1)
无论何时创建具有“retain”属性的属性,使用“self”指针设置属性本身(这与设置属性的某些方面(如文本或字体)不同)将添加一个retain计数。但是,当您只是设置文本,字体,textColor等时,它不会像您在设置文本,字体,textColor等时那样添加保留计数。也不会添加保留计数,正如您已经注意到的那样,当您直接设置实例变量(省略self
指针)。
当您到达此处显示的最后一行时,您的“showTime”将有1个保留计数。
保留#1 = [UILabel alloc]
保留#2 = [self addSubview:self.showTime];
(并且要清楚,这是在这种情况下添加保留计数的addSubview
方法调用...而不是self.showTime
访问者。 / p>
[showTime release]
删除其中一个保留计数,因此保留计数。
除非您再次访问标签,要更改文本,字体等,否则您可能根本不需要创建属性。