Can*_*ner 1 iphone memory-management objective-c
我很难理解NSAutoReleasePool的工作原理.
1)NSAutoReleasePool是单独跟踪每个分配还是依赖于变量?换句话说,这会泄漏内存还是释放?:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSArray* myObj = [NSObject alloc];
myObj = [NSObject alloc];
[pool release];
Run Code Online (Sandbox Code Playgroud)
2)为什么以下代码有效:
NSAutoreleasePool *pool1 = [[NSAutoreleasePool alloc] init];
NSArray* myObj = [NSObject alloc];
for(int i = 0; i < 100; i++) {
[myObj release];
myObj = [NSObject alloc];
}
[pool1 release];
Run Code Online (Sandbox Code Playgroud)
但以下给出了EXC_BAD_ACCESS [pool1 release]
:
NSAutoreleasePool *pool1 = [[NSAutoreleasePool alloc] init];
NSArray* myObj = [NSObject alloc];
NSAutoreleasePool *pool2 = [[NSAutoreleasePool alloc] init];
for(int i = 0; i < 100; i++) {
[myObj release];
myObj = [NSObject alloc];
}
[pool2 release];
[pool1 release];
Run Code Online (Sandbox Code Playgroud)
3)如何使上面的代码工作(具有2个池的代码)?
自动释放池仅适用于您自动释放的对象.代码中的所有对象都不会自动释放,因此不会受到您创建的池的影响.
因此,答案是:
[NSObject alloc]
你真正意味着[[[NSObject alloc] init] autorelease]
你的第二个代码示例将失败,因为你第一次发布myObj
它将是一个在外面声明的对象pool2
.这意味着当您release
pool1
尝试释放已释放的对象时.使其工作的方法是不释放(或自动释放)对象多于保留或分配的对象. 归档时间: |
|
查看次数: |
1781 次 |
最近记录: |