2011-08-23 75 views
1

所以,我創建了一個只包含6個變量的對象。自定義對象類內存管理基礎

#import <Foundation/Foundation.h> 

@interface UserInfoData : NSObject 
{ 
    NSNumber *dealerID; 
    NSNumber *growerID; 
    NSNumber *UID; 
    NSNumber *uLevel; 
    NSString *fName; 
    NSString *lName; 
    NSString *state; 
} 

@property (nonatomic, retain) NSNumber *dealerID; 
@property (nonatomic, retain) NSNumber *growerID; 
@property (nonatomic, retain) NSNumber *UID; 
@property (nonatomic, retain) NSNumber *uLevel; 
@property (nonatomic, retain) NSString *fName; 
@property (nonatomic, retain) NSString *lName; 
@property (nonatomic, retain) NSString *state; 

@end

#import "UserInfoData.h" 

@implementation UserInfoData 

@synthesize dealerID; 
@synthesize growerID; 
@synthesize UID; 
@synthesize uLevel; 
@synthesize fName; 
@synthesize lName; 
@synthesize state; 

-(void) dealloc 
{ 
    [dealerID release]; 
    [growerID release]; 
    [UID release]; 
    [uLevel release]; 
    [fName release]; 
    [lName release]; 
    [state release]; 

    [super dealloc]; 
} 

@end

視圖控制器等

.h文件中:

@class UserInfoData; 

.m文件:

#import "UserInfoData.h" 

iPhoneAppDelegate *dataCenter = (iPhoneAppDelegate *) [[UIApplication sharedApplication] delegate]; 


    UserInfoData *userInfoData = [[[UserInfoData alloc] init]; 

    userInfoData.dealerID = [NSNumber numberWithInt:[[userInfo objectForKey:@"dealerid"] intValue]]; 
    userInfoData.growerID = [NSNumber numberWithInt:[[userInfo objectForKey:@"growerid"] intValue]]; 
    userInfoData.UID = [NSNumber numberWithInt:[[userInfo objectForKey:@"uid"] intValue]];; 
    userInfoData.uLevel = [NSNumber numberWithInt:[[userInfo objectForKey:@"ulevel"] intValue]];; 
    userInfoData.fName = [userInfo objectForKey:@"f_name"]; 
    userInfoData.lName = [userInfo objectForKey:@"l_name"]; 
    userInfoData.state = [userInfo objectForKey:@"state_prov"]; 

    NSArray *userInfoArray = [NSArray arrayWithObjects:userInfoData, nil]; 

    dataCenter.userInfoList = userInfoArray; 

    [userInfoData release]; 

我將數據保存到我用作數據中心的AppDelegate。我需要在另一個視圖控制器中的數據。我也重複這個初始化和釋放其他兩個函數的過程。

視圖控制器B

.h文件中:

@class UserInfoData; 

.m文件:

#import "UserInfoData.h" 
UserInfoData *userInfoData = [[[UserInfoData alloc] init] autorelease]; 
userInfoData = [dataCenter.userInfoList objectAtIndex:0]; 
//do stuff here 
[userInfoData release]; 

通過手動釋放的對象,這會導致問題,當我試圖從檢索我在視圖控制器B的數據中心,我會得到錯誤的內存位置,並得到錯誤的數據(程序崩潰)。

當我切換並使用autorelease初始化對象時,它工作正常。我對內存管理缺少什麼?我沒有泄漏,但我確實有一堆「調用者未在此處擁有的對象的引用計數的錯誤遞減」,我無法追蹤(xcode不告訴我哪個對象,將它打開,或在代碼窗格的行號上給我一個藍色指示器,就像它對警告和錯誤所做的那樣)。那些會導致內存指向錯誤的內存位置?但是如果發生這種情況,爲什麼要autoreleasing他們修復它?

回答

2
UserInfoData *userInfoData = [[[UserInfoData alloc] init] autorelease]; 

您在這裏無故創建了一個新的對象。你把它扔在下一行。如果你正在創建一個新對象,你只需要alloc/init,而不是每次聲明一個變量。

userInfoData = [dataCenter.userInfoList objectAtIndex:0]; 

您拋棄剛剛創建的對象並將不同的對象分配給變量。你不保留這個不同的對象,所以你不應該釋放它。

//do stuff here 
[userInfoData release]; 

您正在發佈不同的對象,但您不擁有它,因爲您沒有保留它。

正確的代碼

UserInfoData *userInfoData = [dataCenter.userInfoList objectAtIndex:0]; 

你不保留它取得所有權,這樣你就不會釋放它。

+0

你完全正確。儘管我仍然不完全理解這裏發生的事情。我雖然創建對象與init'ing它創建了變量,然後我不得不分配一些東西給變量。類似於int b; b = 1; – Padin215

+0

@ Log139:簡單地聲明一個變量就可以創建變量,就像使用'int b'一樣。它只是不包含在這一點上的對象。 '分配一個對象創建一個*對象*,而不是一個變量。 – Chuck

+0

那麼你只需要一次分配一個對象?那麼是否有任何理由分配任何其他自定義對象? – Padin215