所以,我创建了一个只容纳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不告诉我哪个对象,将它打开,或者在代码窗格中的行号上给我一个蓝色指示,就像警告和错误一样。那些会导致内存指向错误的内存位置吗?但如果发生这种情况,为什么要自动释放它们呢?
答案 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];
你没有保留所有权,所以你不发布它。