2012-10-19 67 views
0

我一直使用@synthesize以及在.h文件中聲明的類屬性。我遇到了一些蘋果文檔found here中的PhotoPicker示例,並發現了一個非常令人困惑的聲明。在他們的AppDelegate類(h文件),他們不創造任何實例變量,只是性質,是這樣的:在Apple文檔中發佈ivars並將屬性設置爲零

#import <UIKit/UIKit.h> 
@interface AppDelegate : NSObject <UIApplicationDelegate> 
@property (nonatomic, retain) IBOutlet UIWindow *window; 
@end 

而且在他們的Appdelegate.m文件,他們這樣寫:

#import "AppDelegate.h" 

@interface AppDelegate() 
@property (nonatomic, retain) IBOutlet UINavigationController *navController; 
@end 

@implementation AppDelegate; 

現在,我沒有找到任何@synthesize指令,或任何實例變量,但是如果我看dealloc方法,他們釋放出一些「看不見」的高德(什麼???)

- (void)dealloc 
{ 
    [_navController release]; 
    [_window release]; 

    [super dealloc]; 
} 

而在CL的viewController他們在viewDidUnload中將屬性設置爲零,並在dealloc方法中釋放(未創建的)「ivars」。

這是否與一些新的Xcode的事情?有人可以對此有所瞭解嗎?我正在檢查didReceiveMemoryWarning上的邏輯,並且始終將屬性設置爲viewDidUnload中的零,並釋放了dealloc中的ivars,但我之前沒有看到過。

在此先感謝您的幫助

+0

使用iOS(5或以上)sdk?我認爲xcode會爲我們自動執行此操作,並且此功能是在iOS 5中引入的。 – kidsid49

+0

@synthesise行是使用XCode 4.5自動生成的屬性 – CarlJ

+0

是的,示例使用的是iOS 5.0 SDK,但我們假設我想要定位iOS 4.3 ,即使我沒有申報伊娃,我是否也應該發佈伊娃? –

回答

0

Xcode 4.5可以自動合成屬性。它通過創建普通的setter/getter來實現,並創建一個帶有前綴'_'的ivar。如果你不喜歡,你可以添加自己:

@synthesize foo; 

或使用任何你想要的伊娃:

@synthesize foo=MyFoo; 

這些問題性質和綜合垂直於內存管理。如果你有ARC,並且上述技術正常工作 - 你不需要使用dealloc。但是,如果你不使用arc,那麼你應該使用[_foo release]釋放dealloc中的對象;

推薦使用self.foo = nil來解釋發佈的原因是,使用setter將在您的對象正式發佈後生成KVO通知。

+0

只是要清楚。在我的代碼中,我沒有使用ARC,但它仍然創建以'_'爲前綴的ivar,所以我應該在'viewDidUnload'中將該屬性設置爲nil並將其釋放到'dealloc'中,或者其中一個足夠了? –

+0

好吧,無論值多少錢,如果我使用'@ synthesize'directive,我會在dealloc方法中出錯。所以就是這樣,謝謝你的迴應。 –

+1

如果你不使用ARC,那麼提供一個調用super的dealloc。如果你使用@ synthesize,那麼'[foo release]'。如果你不使用@ synthesize,你的ivar被命名爲'_foo',所以使用[_foo release];' –

相關問題