autorelease使我的应用程序崩溃

时间:2011-03-15 17:11:50

标签: iphone objective-c cocoa memory-management

我的应用程序有时会崩溃:

NSMutableData* position = [NSMutableData dataWithLength: 3 * sizeof(CGPoint)];

NSMutableData调用自动释放时。

这是崩溃日志:

Exception Type:  EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x00000001, 0xe7ffdefe
Crashed Thread:  0

Thread 0 name:
Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   CoreFoundation            0x343dea60 _CFAutoreleasePoolAddObject + 136
1   CoreFoundation                0x343de9cc -[NSObject(NSObject) autorelease] + 8
2   Foundation                0x30c49166 +[NSMutableData(NSMutableData) dataWithLength:] + 34

你知道为什么吗?

更新 返回变量“position”并以这种方式使用:

    NSMutableData *positionData = [[SFinder sharedFinder] move:self.crId] ;
CGPoint *path = [positionData mutableBytes];
CGPoint location0 = path[0];

CGPoint location1 = path[1];

CGPoint location = path[2];

更新2:

我使用NSMutableData删除了代码,但应用程序随机崩溃。在调试控制台上有一条消息:

*** attempt to pop an unknown autorelease pool (0x5830000)

堆栈:

Thread 0 Crashed:
   Dispatch queue: com.apple.main-thread
0   CoreFoundation               0x01348b69 _CFAutoreleasePoolPop + 201
1   UIKit                        0x008a947c _wrapRunLoopWithAutoreleasePoolHandler + 68
2   CoreFoundation               0x013edfbb __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 27
3   CoreFoundation               0x013830e7 __CFRunLoopDoObservers + 295
4   CoreFoundation               0x0134bbd7 __CFRunLoopRun + 1575
5   CoreFoundation               0x0134b240 CFRunLoopRunSpecific + 208
6   CoreFoundation               0x0134b161 CFRunLoopRunInMode + 97
7   GraphicsServices             0x029b3268 GSEventRunModal + 217
8   GraphicsServices             0x029b332d GSEventRun + 115
9   UIKit         0x008a942e UIApplicationMain + 1160
10  MyApp                        0x000029f4 main + 100 (main.m:13)
11  MyApp                        0x00002985 start + 53

5 个答案:

答案 0 :(得分:0)

  

当NSMutableData调用时   自动释放。

...

它自己调用自动释放? 含义? 你使用:

[position release];

[position autorelease];

如果是这样......好吧,不要这样做......你真的不需要它,如果你只用你在问题中写的代码启动它......

答案 1 :(得分:0)

您是否在任何其他代码中保留变量“position”?通常情况下,如果你发布它然后再将autoreleasepool排空,那么当它不再存在时再次释放它。请see this post for possible details

此外,你不应该自己进行变量调用自动释放(如果你的话)。

答案 2 :(得分:0)

或者:

1)封闭的自动释放池(它在哪里?是你自己定义的,还是默认的?)

2)有些东西会释放你的NSMutableData* position。它是在当前NSAutoreleasePool离开其作用域之前执行的,将保留计数发送到0并导致调用dealloc - 然后当自动释放池本身调用release时,由于对象已经崩溃,您将崩溃dealloc'd。

答案 3 :(得分:0)

“position”变量引用的对象由于源自NSMutableData便捷方法而被自动放入默认自动释放池中。可能是默认自动释放池不再有效。我只是在这里猜测。

在任何情况下,默认自动释放池中的对象都保证仅在当前事件上下文的生命周期内保留。这可能与你所看到的有关。

我建议你尝试将“position”变量设为属性为“retain”的实例属性。这将使您更好地控制“位置”对象的生命周期。不要忘记在类的dealloc方法中释放“position”对象。

在我的所有iOS应用中,我严重依赖于目标C框架提供的声明属性功能。如果我希望一个对象“坚持”一段时间,我会使用属性为“retain”的声明属性来引用它。然后我有一个更清晰的想法,确切地说它将保持有效多长时间。我对它的生命周期也有更多的控制权。

希望这有帮助。

  • 让它知道

答案 4 :(得分:0)

发现问题。 NSMutableData存在问题。当您使用initWithLengthdataWithLength启动它时会发生这种情况,并尝试通过mutableBytes插入数据。当您插入最后一个字节时,它会在其他位置进行一些分配(即使内存的那部分由另一个对象拥有),从而导致EXC_BAD_ACCESS和其他与内存相关的错误。因此,使用长度+ 1个字节启动它可以解决问题。