2011-09-19 76 views
0

典型的dealloc有沒有辦法枚舉所有的屬性,並逐一釋放它們?

好吧,它很爛。如果我忘記一個物業去分配會怎麼樣?

爲什麼我們不能有這樣的事dealloc的所有屬性

最糟糕的是,我有點像viewControllers方式正在處理。我們把一個屬性和po放在dealloc中。在正常班上不能有這樣的哈哈?

- (void)dealloc 
{ 
    [_window release]; 
    [__managedObjectContext release]; 
    [__managedObjectModel release]; 
    [__persistentStoreCoordinator release]; 
    [_MainBadgerApplication release]; 
    [_SettingsMiscelaneous release]; 
    [_theNearByIsiKota release]; 
    [Customcell release]; 
    [PhoneCC release]; 
    [searchViewController release]; 
    [_superTabBar release]; 
    [_SuperNavBar release]; 
    [pinNumberView release]; 
    [_lblForPinNumber release]; 
    [navController release]; 
    [NearbyShortcut release]; 
    [_searchListView release]; 
    [_searchNearView release]; 
    [LoadingView release]; 
    [super dealloc]; 
} 

我想到一個宏在那裏我可以做

myDealloc

,這將枚舉所有屬性和釋放逐一或將它們設置爲無(這幾乎相當於)的

+0

**提示**:只是根據您的某些對象名稱進行猜測,但似乎您在等待整個視圖(或甚至應用程序?)被釋放時釋放一些內容,以便跟蹤您的釋放比它所需要的更困難,並且可能將對象保留在記憶中,而不需要保留。許多對象和屬性可以在分配後不久發佈,通常採用相同的方法。不是說你*做錯了什麼,只是基於外表的建議。 –

+0

屬性**不是**自動'釋放'。 – Richard

+0

我知道。這些是屬性,它們必須在dealloc上釋放。大多數局部變量可以更快地自動釋放。 –

回答

1

這看起來像一個可怕的想法,所以這裏是代碼:D這將遍歷代碼中的每個對象屬性併發送一個版本。我沒有編譯它,但它或多或少是這樣的。

#import <objc/runtime.h> 

unsigned int propertyCount; 
objc_property_t *properties = class_copyPropertyList([self class], &propertyCount); 
for (unsigned int i = 0; i < propertyCount; i++) 
{ 
    SEL sel = @selector(release); 
    const char *attr = property_getAttributes(properties[i]); 
    switch (attr[1]) { 
     case '@': 
      property_getName(properties[i]), objc_msgSend(self, sel)] 
      break; 
     default: 
      break; 
    } 
} 
free(properties); 

你可以將它封裝在一個C函數中,並從你的dealloc中調用它。

+0

+1「這看起來像個可怕的想法」 – Richard

+0

爲什麼這麼糟糕? –

+0

property_getName(properties [i]),objc_msgSend(self,sel)] 此原因編譯錯誤 –

1

你不是在這裏枚舉屬性,而是實例變量(可能是屬性關聯的支持變量,當然,但可能不是,你沒有給出聲明屬性的代碼,所以我們不知道)

我的建議:

  • 使用現代運行時的能力(由於存在的iOS使用的iOS - 和OSX僅在64位)來自動生成屬性的後備存儲。因此,您不需要在頭文件中爲您的屬性聲明實例變量,也不會試圖直接使用實例變量而不是屬性
  • dealloc - 和viewDidUnload方法中屬性綁定到IBOutlets - 設定你的@properties爲零(而不是釋放伊娃
  • 最後,一旦你用這種方法管理你的財產,這將有可能通過內省來設置所有的屬性,以零的

一旦你像上面解釋的那樣做,你可以使用內省:使用functions of the Objective-C Runtime獲得給定類的每個@property,再看看直通並將其設置爲nil(這將釋放與@property相關的後盾變量的內存)

+0

我從不使用實例變量。我總是使用財產。即使我的mySynthesize的宏總是激發實例變量。 –

+0

同樣在這裏:)所以更容易管理!我甚至有時候會把'@ synthesize'語句放在.m代碼的末尾,這樣我就可以確定我使用'self.prop'並且永遠不會生成自動生成的底層ivar'prop'(因爲它不存在/還沒有直到符合'@ synthesize') – AliSoftware

1

我會建議一種替代方法。首先,在init或dealloc中將屬性設置爲nil違背了Apple的指導原則。這是因爲你可能會調用setter方法。例如,如果開發人員已經重寫了標準屬性設置器並定義了自定義設置器方法。

在這種情況下,在init或dealloc過程中調用這樣的方法會產生不可預知的結果。

更好地調用[myIvar發佈];像平常一樣。

要追蹤丟失的發佈語句,請運行分析器。或者,甚至更好的是,將目標的構建設置設置爲在構建時始終運行Analyzer。

最後,在Instruments中定期運行您的應用程序是值得的。這將會發現泄漏,並且可以節省您追蹤泄漏內存時發生的奇怪錯誤的時間。

+0

分析器不檢測由於dealloc中缺少釋放而導致的泄漏。實際上,我的一些類沒有dealloc方法,分析器也沒有聲音 –

+0

下面是如何配置它的詳細信息http://loufranco.com/blog/files/category-iphone.html在任何情況下,您都需要在樂器中進行配置以挑選錯過的任何東西 –

相關問題