所以,我創建了一個只包含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他們修復它?
你完全正確。儘管我仍然不完全理解這裏發生的事情。我雖然創建對象與init'ing它創建了變量,然後我不得不分配一些東西給變量。類似於int b; b = 1; – Padin215
@ Log139:簡單地聲明一個變量就可以創建變量,就像使用'int b'一樣。它只是不包含在這一點上的對象。 '分配一個對象創建一個*對象*,而不是一個變量。 – Chuck
那麼你只需要一次分配一個對象?那麼是否有任何理由分配任何其他自定義對象? – Padin215