繁体   English   中英

Objective-C 初学者(发布)问题

[英]Objective-C Beginner (release) question

我刚开始学习 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'属性? 因为如果我理解正确,我必须在这些函数的末尾对位于函数内部的所有变量调用“释放”,但是在 class 属性上,我必须只在“dealloc”方法中调用“释放”?

谢谢

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

您通过发送 alloc、copy、new 或 mutableCopy 来声明所有权。 查看Apple 的 Memory 管理编程指南 / Object Ownership and Disposal 如果您通过发送保留手动保留,您也应该释放。

关于这一点,您不必释放 nameString。

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

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

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

我通过谷歌翻译的 Obj-C to English 过滤器运行了你的代码:

@synthesize name;

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

self.name = textInput.text;

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

NSString *nameString = name;

创建一个新变量nameString ,并将其指向name指向的同一个 object。 (I'm not doing anything that affects the memory management of that object; I just want a new label that I can use to refer to the object by.)

nameString = @"Cartman";

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

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

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

Grab a chunk of memory the correct size for an NSString object, and set up that memory with the following arguments:.... Point the variable greeting at that object. 由于我使用alloc明确要求此 memory ,因此我对此负责。 当我不再需要它时,我将release object 并释放 memory。

label.text = greeting;

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

[greeting release];

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

英语比 Objective-C 有点冗长。 :)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM