2012-04-23 63 views
3
objc[1655]: Object 0x2314e0 of class __NSCFString autoreleased with no 
pool in place - just leaking - break on objc_autoreleaseNoPool() to 
debug 

objc[1655]: Object 0x2315e0 of class NSPathStore2 autoreleased with 
no pool in place - just leaking - break on objc_autoreleaseNoPool() to 
debug 

objc[1655]: Object 0x2316b0 of class __NSCFData autoreleased with no 
pool in place - just leaking - break on objc_autoreleaseNoPool() to 
debug 

File:MultiFormatReader.mm Method:+[MultiFormatReader load] -- 

objc[1655]: Object 0x2317e0 of class __NSCFString autoreleased with 
no pool in place - just leaking - break on objc_autoreleaseNoPool() 
to debug 

objc[1655]: Object 0x231800 of class __NSCFData autoreleased with no 
pool in place - just leaking 
- break on objc_autoreleaseNoPool() to debug 

..++++++++ 

File:main.mm Method:main -- mark.. 

File:BarcodesAppDelegate.m Method:-[BarcodesAppDelegate 
application:didFinishLaunchingWithOptions:] - 
File:BarcodesAppDelegate.m Method:-[BarcodesAppDelegate 
application:didFinishLaunchingWithOptions:] - 

這是相對碼:IOS在main()之前執行什麼?

+ (void)load { 
    MPLog(@" ..++++++++"); 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    [FormatReader registerFormatReader:[[[self alloc] init] autorelease]]; 
    [pool drain]; 
} 


int main(int argc, char *argv[]) { 
    MPLog(@"mark.."); 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    int retVal = UIApplicationMain(argc, argv, nil, nil); 
    [pool release]; 
    return retVal; 
} 

這是我調試消息,我用我的應用程序框架斑馬線,但我發現main()方法執行之前,已經執行一些其他的代碼。爲什麼?一般來說,在main()之前執行的是什麼? 這個程序是什麼" objc[1655]: Object 0x2314e0 of class __NSCFString autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug"是什麼意思?

回答

2

將2 MPLog s移動到NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];以下?

+ (void)load { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    MPLog(@" ..++++++++"); 
    [FormatReader registerFormatReader:[[[self alloc] init] autorelease]]; 
    [pool drain]; 
} 


int main(int argc, char *argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    MPLog(@"mark.."); 
    int retVal = UIApplicationMain(argc, argv, nil, nil); 
    [pool release]; 
    return retVal; 
} 
+0

沒有區別.. – Petros 2012-04-23 15:08:50

+0

註釋掉兩條MPLog線,看看你是否仍然存在這個問題,這樣我們就可以看到它是否是導致問題的原因。 – 2012-04-23 15:10:20

+0

好的,我正在測試.. – Petros 2012-04-23 15:18:39

1

objc_autoreleaseNoPool設置一個象徵性的斷點遇到此錯誤時停止執行。然後你可以確定你需要放置你的autorelease池(顯式地)。

一般來說,main()之前的什麼動作?

從+ [NSObject的負載]文檔:

每當一個類或類別被添加到目標C 運行時調用;實施此方法以加載 時執行類別特定的行爲。

+ (void)load

討論負載消息被髮送到種類和類別,它們都動態加載和靜態鏈接的,但只有當新加載的類或類別實現了可以響應的方法。

初始化的順序如下:

  • 在您鏈接到任何框架所有的初始化。
  • 圖像中的所有加載方法。
  • 圖像中的所有C++靜態初始化程序和C/C++ __attribute__(constructor)函數。
  • 鏈接到您的框架中的所有初始值設定項。

此外:

  • 類的+負載方法畢竟的其超+負載的方法調用。
  • 類別+加載方法在類自己的+加載方法後調用。
  • 在加載的自定義實現中,您可以安全地從同一圖像中發送其他不相關的類,但是由這些類實現的任何加載方法可能尚未運行。
+0

謝謝,賈斯汀,我明白了.. – Petros 2012-04-23 15:19:05

0

我看到了同樣的問題。如果我把一個斷點objc_autoreleaseNoPool,在主線程上,我得到以下無用的堆棧跟蹤:
0 0x332097b8 in objc_autoreleaseNoPool()
1 0x331fe7b8 in (anonymous namespace)::AutoreleasePoolPage::autoreleaseSlow(objc_object*)()
2 0x332098de in _ZL22_objc_rootAutorelease2P11objc_object()
3 0x331fcdb6 in _objc_rootAutorelease()

這似乎是擊中自動釋放錯誤在應用任何事情之前實際上已經開始。這可能是我在項目中包含的其中一個框架中的一些加載方法的結果嗎?

+0

把這個放在這裏,否則stacktrace基本上是不可讀的。 – Liron 2012-08-01 13:51:30

相關問題