【问题标题】:Objective-C Beginner (release) questionObjective-C 初学者(发布)问题
【发布时间】:2011-09-11 06:19:38
【问题描述】:

我刚刚开始学习 Objective-C。我阅读了 Cocoa 成为 XCoder 一书,我想我学到了基础知识。现在,我正在关注一个在线教程,在那里我遇到了这段代码:

@synthesize name;

- (IBAction)changeGreeting:(id)sender {
self.name = textInput.text;

NSString *nameString = name;
if([nameString length] == 0) {
    nameString = @"Cartman";
}
NSString *greeting = [[NSString alloc] 
                      initWithFormat:@"Hello, my name is %@!", nameString];
label.text = greeting;
[greeting release];
}

我的问题是,我们不应该在 *nameString 变量上也调用 'release' 吗? 或者通过这样做我也会清理应该在'dealloc'方法中释放的'name'属性? 因为如果我理解正确,我必须在这些函数的末尾对位于函数内的所有变量调用“释放”,但在类属性上,我必须只在“dealloc”方法中调用“释放”?

谢谢

【问题讨论】:

  • 普遍的共识是,如果你在一个对象上调用alloc,它应该被释放到某个地方。我相信你创建的 NSString 是自动发布的。

标签: iphone objective-c xcode release retain


【解决方案1】:

greeting 被释放,因为 分配了它。 nameString 不需要释放,因为它是一个赋值。作为一般经验法则,您必须释放您 alloc 的对象。

请参阅伟大的Apple Memory Management Guide 以获得更多帮助。内存管理对于很多iOS初学者来说是一个很大的障碍,内存管理指南基本上应该是必读的。

此外,在这个具体示例中,您并不需要 nameString 变量,您可以在任何使用它的地方使用 self.name

【讨论】:

  • 谢谢。确实如此。我来自 Web 环境,PHP 和那里绝对不必担心内存管理,在调用 @unlink 到您启动的对象的意义上
【解决方案2】:

仅发布您声明所有权的对象。这意味着您设置为保留或复制的每个属性。不要释放分配的属性。

您通过发送 alloc、copy、new 或 mutableCopy 来声明所有权。看看Apple's Memory Management Programming Guide / Object Ownership and Disposal。如果您通过发送保留手动保留,您也应该释放。

对此,您不必释放 nameString。

【讨论】:

  • 该死的。你设法用 6 行解释了一整章无法做到的事情。我现在明白了,我阅读了内存管理指南,在阅读了你的答案之后,现在很有意义。谢谢!
【解决方案3】:

nameString 变量只是一个指针,指向存储在 name 的类属性中的任何内容。因此,该字符串在技术上存储在 nameString 指向的内存块中。当您的方法结束时,nameString 指针会简单地从内存中清除。但是,名称仍将指向该内存。如果您释放 nameString,它将清除 name 也指向的内存,因此如果您稍后尝试访问与 name 关联的内存,则会给您带来问题。

【讨论】:

    【解决方案4】:

    我通过 Google 翻译的 Obj-C 到英文过滤器运行了您的代码:

    @synthesize name;
    

    亲爱的编译器:请代表我为这个名为name 的属性创建一个setter 和一个getter 方法。

    self.name = textInput.text;
    

    获取textInput.text 中的对象并使用之前创建的setter 方法将其放入我的名为name 的属性中。

    NSString *nameString = name;
    

    创建一个新变量nameString,并将其指向name 指向的同一对象。 (我没有做任何影响该对象的内存管理的事情;我只想要一个新标签,我可以用它来引用该对象。)

    nameString = @"Cartman";
    

    让我的变量nameString 指向另一个对象,一个文字字符串。

    (这不会改变name指向的对象:
    如果name -> OBJECT,
    nameString = name 之后,还有nameString -> OBJECT
    但如果是nameString = OTHER_OBJECT,还是name -> OBJECT。)

    NSString *greeting = [[NSString alloc] 
                      initWithFormat:@"Hello, my name is %@!", nameString];
    

    NSString 对象获取一块正确大小的内存,并使用以下参数设置该内存:.... 将变量greeting 指向该对象。由于我使用alloc 明确要求此内存,因此我对此负责。当我不再需要它时,我会release该对象并释放内存。

    label.text = greeting;
    

    greeting指向的对象放入labeltext属性中。 label 应该对对象进行所需的任何内存管理;那部分不是我的问题。

    [greeting release];
    

    我不再需要我创建的那块内存。摆脱它,匆忙发布。

    英语比Objective-C要冗长一些。 :)

    【讨论】:

    • 您好,感谢您抽出宝贵时间向我详细解释。它真的帮助我理解了代码在做什么。 P.S:(我不知道 Obj-C 到英语的翻译器在哪里,但我应该把它收藏起来!!:)))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    相关资源
    最近更新 更多