2011-12-22 83 views
0

我新的目标C,这里是我的困惑:目标C:分配内存

当它是适用于一个实例分配内存?就像这样:

当它是适用于使用本...

NSString *str = [[NSString alloc]init]; 

,并用这个...

- (NSString *) formatStr:(NSString *) str{ 
    NSString *str = (NSString *) str; 
... 
..... 
....... 
} 

,甚至创造UIActionSheet,它使用的页头,但在其他UI元素,它不..

什么原因和什么时候应该做什么?

感谢小伙子们..:d

回答

2

除“正常”分配路径(即通过[[MyClass alloc] init])一些类提供所谓的“工厂方法”。这些是在内部分配对象的类方法。使用工厂方法的优点是可以创建合适的子类以返回给调用者。不过,在这两种情况下,分配最终均由alloc/init完成。

0

当你使用alloc + init创建一个实例或者你通过一个名字为init的方法(一个约定,例如initWithString)来获得一个实例时,你被认为拥有该对象,这是,你不能保留它(它的参考计数器已经设置为1),并且当你完成它时需要最终释放它。当你通过调用一个没有获得init名字的方法来接收一个实例的时候(规则在拇指上,但你应该总是检查文档),这意味着你不是该对象的所有者,即该对象可能随时被释放,即使在你使用它的时候。通常,诸如stringWithFormat之类的方法将返回自动释放的对象,这些对象将一直持续到事件周期结束(除非通过在字符串上调用retain来声明所有权)。 我强烈建议您阅读cocoa memory management guide.

NSString *str = [[NSString alloc]init]; //you own the object pointed to by str. Its retain count is 1. If you don't call release this will be a memory leak. 


- (NSString *) formatStr:(NSString *) str{ 
    NSString *str = (NSString *) str; //you don't own str. btw, you don't need casting here 
//using str here might throw exception if its owner has released it 
    [str retain]; //you own str now. you can do whatever you want with it. It's yours 
....... 
} 
+0

thanks pencho .. – Aldee 2011-12-22 07:12:33