簡體   English   中英

C ++和Objective-C自動發布問題

[英]C++ and Objective-C autorelease problem

我分為三層,底層是用C ++編寫的,另外兩個中間層和頂層都是用Objective-C編寫的。

C ++層在中間層存儲對類的引用,中間層也在頂層存儲對類的引用。

接收到來自中間層的請求后,底層負責異步調用中間層中的方法,而該方法又依次調用頂層中的方法。

不幸的是,我的代碼報告如下錯誤:

* _NSAutoreleaseNoPool():類NSCFNumber的對象0x523e50在沒有池的情況下自動釋放-只是泄漏堆棧:(0x95c83f0f 0x95b90442 0x28d3 0x2d42 0x95b96e0d 0x95b969b4 0x93a00155 0x93a00012)

問題是頂層的方法是從沒有自動釋放池的C ++ POSIX線程調用的。 我唯一能想到的解決方案是在中間層添加以下內容:

bool temp = false;

- (void) method ...
{
  if (!temp)
  {
    temp = true;
    NSAutoreleasePool *arPool = [[NSAutoreleasePool alloc] init];    
  }

  call_to_the_top_layer();
}

這可行。 我的問題是,還有其他更好的解決方案嗎? 真丑

只是總是分配一個自動釋放池,這沒問題。 但是您還需要釋放池,否則會發生內存泄漏:

- (void) method
{
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

  // start doing some work, for example:
  call_to_the_top_layer();

  [pool release];
}

您始終可以創建池,但必須在同一塊中將其釋放。 通常,您不需要這樣做,除非您創建新線程或有時在分配大量臨時值的循環中使用,以避免過多的垃圾堆積並填滿內存。

據我了解您的問題,您在線程的最底層有一個中間層。 正如您已經發現的那樣,如果要使用Cocoa框架,則必須有一個自動釋放池(這與Objective-C無關)。

您應該在創建線程時創建一個,或者為對中間層的每個請求創建並釋放一個。 您的“解決方案”確實會創建一個按需使用的方法,該方法可以一直持續到線程的工作日結束

哪一個最好取決於您的體系結構:

  • 線程存活多長時間?
  • 在整個生命周期中只有一個自動釋放池可以嗎?

更新:

釋放臨時池時,應注意可能發生的異常:

id pool = [[NSAutoreleasePool alloc] init];
@try {
    …
} @finally {
    [pool release];
}

如果沒有 /使用Objective-C異常,DarkDust的答案是正確的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM