当我设置属性(保留)时,一个“自我”=一个“保留”?

时间:2012-10-08 13:49:55

标签: objective-c memory-management properties retain

虽然我即将完成我的第一个应用程序,但我仍然对基本的内存管理感到困惑。我已阅读了很多帖子和苹果文档,但我仍然感到困惑。 例如..我正在做这样的事情以编程方式添加标签:

@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]它没有自我。因为我知道这将保留两次.. 但在分配之后,我放回了“自我”。设置属性..

我的直觉告诉我,我做错了,但它表面上看起来很好,我发现分析和仪器没有内存泄漏......有人可以给我建议吗?当我使用“自我”。设置文本和设置背景颜色,它会自动保留一个吗?太多了!

2 个答案:

答案 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]删除其中一个保留计数,因此保留计数。

除非您再次访问标签,要更改文本,字体等,否则您可能根本不需要创建属性。