我刚开始学习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'?
由于
答案 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关联的内存,则会在以后出现问题。