使用我没有分配或初始化的对象

时间:2011-11-08 03:11:05

标签: objective-c inheritance object methods initialization

我刚写了一些代码。它有我自己定制的课程。在那个定制的名为“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创建的”是否称为变量是正确的?

我想我知道两者之间的差异,但只是想要放心。

感谢。

1 个答案:

答案 0 :(得分:2)

您正在将NSString *stringToReturn初始化为[myNumber storedNumberAsString]的返回值。在storedNumberAsString内,您可以看到它返回NSString引用,已正确分配,所有内容都可以使用。

这里的关键是autorelease,这会导致对象在“稍后的某个时间”被自动释放(实际上当最顶层的自动释放池被释放时,除非你自己改变它,否则往往会在每次迭代后发生)事件循环)。

Objective-C中的约定是,如果您allocretain是对象,或者从名称以newcopy开头的方法中获取对象,或mutableCopy,您有责任释放它。否则,您可以假设它将由其他人释放(例如,稍后通过autorelease)。由于storedNumberAsString不是以newcopymutableCopy开头,因此您不需要发布它。同时storedNumberAsString的实现必须确保它alloc被释放的对象 - 在这种情况下通过调用autorelease来完成。