自定义对象类内存管理基础知识

时间:2011-08-23 20:58:02

标签: objective-c object memory-management

所以,我创建了一个只容纳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

查看控制器A

.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中的数据中心检索它时,这会导致问题,我会得到错误的内存位置并获取错误的数据(这会导致程序崩溃)。

当我在初始化对象时切换并仅使用自动释放时,它工作正常。我对内存管理缺少什么?我没有泄漏,但我确实有一堆“调用者不在此时拥有的对象的引用计数的不正确的减少”,我无法追踪到(xcode不告诉我哪个对象,将它打开,或者在代码窗格中的行号上给我一个蓝色指示,就像警告和错误一样。那些会导致内存指向错误的内存位置吗?但如果发生这种情况,为什么要自动释放它们呢?

1 个答案:

答案 0 :(得分:2)

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

你无缘无故地在这里创建一个新对象。你把它扔到下一行。如果要创建新对象,则只需要分配/ init,而不是每次声明变量时都需要。

userInfoData = [dataCenter.userInfoList objectAtIndex:0];

您丢弃刚刚创建的对象并为变量分配不同的对象。你没有保留这个不同的对象,所以你不应该发布它。

//do stuff here
[userInfoData release];

您正在发布不同的对象,但是您没有保留它,因为您没有保留它。

正确的代码是

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

你没有保留所有权,所以你不发布它。