2012-07-16 51 views
1

我需要把事情弄清楚Objective-C的內存管理:內存管理,事情是明確的

如果我宣佈在類的頭作爲伊娃對象沒有@property:

@interface MyFacebooDelegate : UIViewController 
{ 
    TableViewController *tableController; 
} 
... 
@end 

和一些地方在例如代碼- (void)viewDidLoad我做的:

tableController = [[TableViewController alloc] init]; 

那麼,是釋放它最好的方式。如果我使即時對象成爲一個屬性會有什麼不同?以及如何在內存管理將太

@interface MyFacebooDelegate : UIViewController 
{ 
    TableViewController *tableController; 
} 
... 
@end 
@property (nonatomic, strong) TableViewController *tableController; 

以下語法爲對象的viewController做到底:

.H

@interface AppDelegate : UIResponder <UIApplicationDelegate> 
@property (strong, nonatomic) ViewController *viewController; 
@end 

.M

@implementation AppDelegate 

@synthesize window = _window; 
@synthesize viewController = _viewController; 

- (void)dealloc 
{ 
    [_window release]; 
    [_viewController release]; 
    [super dealloc]; 
} 
..... 
@end 

如果我想通過一個方法返回一個對象到另一個類,我需要autorelease我t在方法體中,然後retain它在接收端? 例如這種方法正是在方法體,並在接收方太做:

-(NSString *)getFriendId 
{ 
NSArray *ar = [NSArray arrayWithObjects:@"1",@"2",@"3", nil]; 
return [ar objectAtIndex:0]; 
} 

我知道這個了很多,但我真的很困惑,需要你的幫助。

+0

http://stackoverflow.com/search?q =%5Bobjective-c%5D ++內存+管理 – 2012-07-16 14:40:53

回答

2

1)最好的辦法是dealloc;或者在重新設置之前。

2)屬性爲您保留/釋放。但警告!你繼續混淆東西。您在這裏使用「強」,這與ARC有關。如果你真的堅持使用經典的保留/釋放(你不應該),那就使用(非原子的,保留)。

3)您的屬性會在dealloc上釋放。再一次,強者在這裏是錯誤的。

4)是的。理想情況下,你應該。 ARC很棒的另一個原因是,它自動完成這一切。

tl; dr:使用ARC。永遠不要回頭。 (但仍然學習手動內存管理)

+0

正確,Apple的新示例使用強壯,即使他們的文檔聲明您應該使用assign/retain。國際海事組織在古典保留/釋放方面具有誤導性。 – steipete 2012-07-16 15:06:46

1

ARC是所有內存管理問題的答案。除了強大和弱財產之外,還有非常重要的注意事項:

iOS強大的財產:在ARC之前的財產聲明中保留的強度如此之高。對於ARC項目,我會使用強而不是保留,我將使用assign for C原始屬性。

iOS應該定義爲聲明屬性。除了從文件所有者到應用程序強大的nib文件中的頂級對象(或者在iOS中,故事板場景),出口通常應該很弱。因此,您創建的插座通常會很弱,因爲:您創建的插座(例如,視圖控制器視圖的子視圖或窗口控制器的窗口)是對象間的任意引用,並不意味着擁有所有權。