ave*_*dev 0 iphone objective-c
我设法让自己对内存管理的一些元素感到困惑.我是Objective-c和内存管理语言的新手.
我已经阅读了内存管理指南,但我仍然对一些事情感到困惑.1)是否需要清理任何对象未保留的ivars和方法变量.例如
-(void) someMethod{
int count = 100;
for (int i=0; i <count; i++) {
NSLog(@"Count = %d", i);
}
}
Run Code Online (Sandbox Code Playgroud)
方法完成后"count"var会发生什么?如果一个方法分配了很多临时变量,那么只要它们没有发布,就会从内存中删除那些临时变量吗?或者我需要以某种方式将它们设置为零?
2)如果我有一个静态变量,例如NSString,那么在取消分配类时,我是否必须做任何事情才能从内存中删除?
3)我注意到NSStrings似乎有一个2147483647的retainCount,维基百科告诉我这是32位有符号整数的最大值.
http://en.wikipedia.org/wiki/2147483647
myString retainCount = 2147483647
-(void) someMethod{
NSString *myString = @"testString";
NSLog(@"myString retainCount = %d", [myString retainCount]);
// logs: myString retainCount = 2147483647
}
Run Code Online (Sandbox Code Playgroud)
在方法结束时会发生什么?这个记忆是否会被清空?任何东西都没有引用该字符串.我的理解是NSString的@""方便方法返回一个自动释放的对象,但是最后还是使用retainCount为2147483647自动释放的东西呢?在这种情况下,保留或释放任何NSString的意义何在?
我很清楚retainCount应该被忽略,但它只是让我不知道这里发生了什么.
4)这有关系吗?我知道与NSString相关的内存并不多,但我想成为一名优秀的内存管理公民,而且我对最佳实践比其他任何事情都更感兴趣.
保留/释放仅对对象有用,而不是int,bool,float,double或其他内置函数.因此,将它用于id您持有指向对象的指针的其他类.在您的示例中,不需要保留或释放计数.它在堆栈上分配,在函数返回时自动清理.
您需要处理任何本地对象alloc.这些是在retainCount设置为1的情况下创建的,因此您需要保留它们以供稍后使用或释放它们.大多数Cocoa函数(不以copy或alloc开头)返回一个自动释放的对象.这意味着他们将在稍后调用它们 - 如果你在它们上面调用retain,你只能在函数之后保存它们.如果你想要清理它们,你不需要做任何事情(调用release会导致释放调用太多).
如果您有一个指向对象的静态变量,那么当该类的对象被解除分配时,它不会被触及.如果您希望它被释放,您必须在其上调用release.如果static是int,bool或其他内置函数,则不能(不能)调用它上面的release.这是应用程序全局记忆的一部分.
设置为字符串文字的NSStrings不应该调用它们的版本.retainCount对他们来说毫无意义.对于signed int值,该值也为-1.
如果你这样做[[NSString alloc] initCallHere:etc]- 你必须打电话给它.大多数时候你得到字符串,你不使用alloc,所以你不需要调用release.如果你保留一个,你需要打电话给释放.
是的,这很重要.随着时间的推移泄漏将导致iPhone杀死您的应用程序.