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

Objective c 当我设置属性(保留)时,一个;自我";=“一”;保留;?,objective-c,memory-management,properties,retain,Objective C,Memory Management,Properties,Retain,虽然我即将完成我的第一个应用程序,但我仍然对非常基本的内存管理感到困惑。我已经阅读了这里的许多帖子和苹果文档,但我仍然感到困惑。。 例如..我目前正在做类似的事情,以编程方式添加标签: @property (retain, nonatomic) UILabel *showTime; @sythesize showTime; showTime = [[UILabel alloc] initWithFrame:CGRectMake(45, 4, 200, 36)]; [self.showTime

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

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


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

实际上,如果您将属性赋予任何元素,那么这意味着,您为该元素提供了一个自动getter/setter

 @property (retain, nonatomic) UILabel *showTime;
 @synthesize showTime;
现在,为了访问这些getter/setter,您必须使用self初始化元素

所以呢,总是这样,

 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]];

什么都行

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

 self.showTime = nil;
实际上,retain属性生成一个setter方法,如下所示

 - (void)setShowTime:(UILabel *)label {
     if (showTime != label) {
         [showTime release];
         showTime = [label retain];
     }
 }
因此,当我们处理内存更改时,即分配或解除分配时,请使用SELF

然而,这是我对自我使用的理解。任何其他想法,都欢迎


希望能有帮助

无论何时创建具有“retain”属性的属性,使用“self”指针设置属性本身(这不同于设置属性的某些方面,如文本或字体),都将添加保留计数。但是,它不会像设置文本、字体、文本颜色等时那样,在您简单访问时添加保留计数。也不会像您自己指出的那样,在您直接设置实例变量时(省去
self
指针),添加保留计数

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

保留#1=
[UILabel alloc]

Retain#2=
[self addSubview:self.showTime]
(需要明确的是,在本例中,添加保留计数的是
addSubview
方法调用,而不是
self.showTime
访问器)

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


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

heh,阅读这些关于属性保留计数和微笑的帖子。使用arc和保持快乐)虽然在过去的岁月里,这对我来说也是一段艰难的时光,但这是需要知道的重要事情之一。ARC会自动执行此操作。因此,它是内存管理层的顶层。知道里面的烹饪方法总是很好的,对吗?:)除此之外,知道它会自己处理也很可怕。想象很多很多很多自动释放的变量。虽然ARC好得多,而且不会崩溃,但这是一种艰难的方式,如果你知道这一点,你就会知道事情变得非常复杂:)非常感谢!!如果我有两票,我也愿意接受你的答案!是的,我很快就要换成ARC了,但是如果我不能完成这些“基本”的东西,我会感到内疚……沃尔特-是的,你必须有关于内存管理的基本知识。顺便说一句,你可以随时做投票@Stas-是的,我也是,只使用ARC,但你永远不知道!谢谢你的快速回复!我可以再问一个问题吗?如果我把[showTime release]放进去有意义吗;[showTime发布];这意味着在我不再需要标签的时候释放两次以解除锁定?不!首先,你不应该在那个位置调用release,而应该在你的dealloc中调用release。将其添加到的视图将负责其自身的保留/释放平衡。此外,至少在下一个项目中,使用ARC。这真的是一种正确的方式来做这些天,而不是不专业地不管理自己的记忆。我真的很感激你的“不专业地不管理自己的记忆”,谢谢!事实上,我发现我已经创建了很多对象,无法在instrument tool中有效地销毁,如果问题仍然存在,我肯定会在这个项目中更改为ARC right。。
 - (void)setShowTime:(UILabel *)label {
     if (showTime != label) {
         [showTime release];
         showTime = [label retain];
     }
 }