1

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

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

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

4

2 回答 2

1

每当您创建具有“保留”属性的属性时,使用“自我”指针设置属性本身(这与设置属性的某些方面不同,例如文本或字体),将添加保留计数。但是,当您简单地访问它时,它不会添加保留计数,就像您在设置文本、字体、textColor 等时所做的那样。也不会像您自己指出的那样添加保留计数,当您直接设置实例变量(通过省略self指针)。

当您到达此处显示的最后一行时,您的“showTime”将有 1 个保留计数。

保留 #1 =[UILabel alloc]

Retain #2 = [self addSubview:self.showTime];(需要明确的addSubview是,在这种情况下,添加保留计数的是方法调用......而不是self.showTime访问器)。

[showTime release]删除保留计数之一,因此保留一个。

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

于 2012-10-08T14:09:07.630 回答
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]];

或者

 [showTime setText:[NSString stringWithFormat:@"%d", time]];

一切都会好的。

但是,在 DEALLOC 部分,您再次需要 self 将其设置为零。

 self.showTime = nil;

实际上,retain 属性会生成一个 setter 方法,如下所示。

 - (void)setShowTime:(UILabel *)label {
     if (showTime != label) {
         [showTime release];
         showTime = [label retain];
     }
 }

因此,当我们在处理内存变化时,即ALLOCation 或Deallocation 时,此时使用SELF。

但是,这是我对自我用法的理解。任何其他想法,总是受欢迎的!

希望能帮助到你!!!!

于 2012-10-08T14:06:01.653 回答