目标C:分配记忆

时间:2011-12-22 03:03:52

标签: iphone objective-c xcode

我是Objective C的新手,这是我的困惑:

什么时候适用于为实例分配内存?像这样:

何时适用于此......

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

并使用此...

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

甚至创建UIActionSheet,它使用alloc,但在其他UI元素中,它不会..

究竟是什么原因以及何时完成?

谢谢fellas ..:D

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

Objective C的alloc方法处理分配内存,您不必担心分配,只需管理保留和释放周期。

结帐About Memory Management article from Apple

答案 2 :(得分:0)

当你使用alloc + init创建一个实例时,或者通过名称中包含init的方法获得一个实例(一个约定,例如initWithString)你被认为拥有该对象,这就是你不能保留它(它的ref计数器已经设置为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
.......
}