首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义对象类内存管理基础知识

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

Stack Overflow用户
提问于 2011-08-24 04:58:02
回答 1查看 331关注 0票数 1

所以,我创建了一个只包含6个变量的对象。

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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文件:

代码语言:javascript
复制
@class UserInfoData;

.m文件:

代码语言:javascript
复制
#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文件:

代码语言:javascript
复制
@class UserInfoData;

.m文件:

代码语言:javascript
复制
#import "UserInfoData.h"
UserInfoData *userInfoData = [[[UserInfoData alloc] init] autorelease];
userInfoData = [dataCenter.userInfoList objectAtIndex:0];
//do stuff here
[userInfoData release];

通过手动释放对象,当我试图从视图控制器B中的数据中心检索它时,这将导致问题,我将获得错误的内存位置和错误的数据(导致程序崩溃)。

当我在初始化对象时切换并仅使用自动释放时,它工作得很好。关于内存管理,我遗漏了什么?我没有泄漏,但我确实有一堆我无法跟踪的“不正确地减少了此时不属于调用者的对象的引用计数”(xcode不会告诉我它在哪个对象上,或者在代码窗格的行号上给我一个蓝色的指示器,就像它对警告和错误所做的那样)。这些会不会导致内存指向错误的内存位置?但是,如果发生了这种情况,为什么自动发布它们会修复它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-24 05:15:24

代码语言:javascript
复制
UserInfoData *userInfoData = [[[UserInfoData alloc] init] autorelease];

您在这里无缘无故地创建了一个新对象。在下一行中将其丢弃。只有在创建新对象时才需要alloc/init,而不是每次声明变量时。

代码语言:javascript
复制
userInfoData = [dataCenter.userInfoList objectAtIndex:0];

您正在丢弃刚刚创建的对象,并将一个不同的对象分配给该变量。你没有保留这个不同的对象,所以你不应该释放它。

代码语言:javascript
复制
//do stuff here
[userInfoData release];

您正在释放不同的对象,但您并不拥有它,因为您没有保留它。

正确的代码是

代码语言:javascript
复制
UserInfoData *userInfoData = [dataCenter.userInfoList objectAtIndex:0];

你不会通过保留它来获得所有权,所以你不会释放它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7167451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档