我刚写了一些代码。它有我自己定制的课程。在那个定制的名为“WonderfulNumbers”的类中,我有一个看起来像这样的方法
- (NSString *)storedNumberAsString {
NSString *stringToReturn = [[NSString alloc]initWithFormat:@"Hello World"];
return [stringToReturn autorelease];
}
我显然然后#import“WonderfulNumbers”进入主要等等 然后在我的主要我有一个IBAction。 它读起来如下
-(IBAction)displaySomeText:(id)sender {
WonderfulNumbers *myNumber = [[WonderfulNumbers alloc]init];// Step 1
NSString *numberString = [myNumber storedNumberAsString];// Step 2
[textView insertText:numberString];// Step 3
//textView is a variable of NSTextView.
[myNumber release];// Step 4
}
我得到了一步一步的过程,以及这背后的逻辑。 我想知道并试图让自己放心,这就是第2步究竟发生了什么。
我理解第1,3和4步。
但是第2步,我创建了一个名为'numberString'的NSString变量,它显然拥有一个名为'myNumber'的对象,并将上述方法应用于它。说得通。
我想知道的是,我从未分配或初始化NSString类的'numberString'对象。我怎么能用它呢。 我知道我不会释放它,因为它从未被分配..但我只是通过[myNumber storedNumberAsString]初始化它; ?
轻微的解释会很棒。感谢那些回复的人。
P.S。我知道objective-c中的所有内容都是一个对象,但仅仅是为了这个参数,因为'numberString'在技术上并不是“由allocate和init创建的”是否称为变量是正确的?
我想我知道两者之间的差异,但只是想要放心。
感谢。
答案 0 :(得分:2)
您正在将NSString *stringToReturn
初始化为[myNumber storedNumberAsString]
的返回值。在storedNumberAsString
内,您可以看到它返回NSString
引用,已正确分配,所有内容都可以使用。
这里的关键是autorelease
,这会导致对象在“稍后的某个时间”被自动释放(实际上当最顶层的自动释放池被释放时,除非你自己改变它,否则往往会在每次迭代后发生)事件循环)。
Objective-C中的约定是,如果您alloc
或retain
是对象,或者从名称以new
,copy
开头的方法中获取对象,或mutableCopy
,您有责任释放它。否则,您可以假设它将由其他人释放(例如,稍后通过autorelease
)。由于storedNumberAsString
不是以new
,copy
或mutableCopy
开头,因此您不需要发布它。同时storedNumberAsString
的实现必须确保它alloc
被释放的对象 - 在这种情况下通过调用autorelease
来完成。