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

时间:2011-06-08 22:02:39

标签: iphone objective-c xcode release retain

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

由于

4 个答案:

答案 0 :(得分:5)

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

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

关于此,您不必释放nameString。

答案 1 :(得分:2)

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

查看精彩的Apple Memory Management Guide以获取进一步的帮助。内存管理是许多iOS初学者的一大障碍,内存管理指南应该基本上需要阅读。

此外,在此特定示例中,您并不真正需要nameString变量,您可以在任何地方使用self.name

答案 2 :(得分:2)

我将您的代码通过Google Translate的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指向的对象,并将其放入名为label的{​​{1}}属性中。 text应该对对象进行任何需要的内存管理;那部分不是我的问题。

label

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

英语比Objective-C有点晦涩。 :)

答案 3 :(得分:0)

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