所以,我创建了一个只包含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不会告诉我它在哪个对象上,或者在代码窗格的行号上给我一个蓝色的指示器,就像它对警告和错误所做的那样)。这些会不会导致内存指向错误的内存位置?但是,如果发生了这种情况,为什么自动发布它们会修复它?
发布于 2011-08-24 05:15:24
UserInfoData *userInfoData = [[[UserInfoData alloc] init] autorelease];您在这里无缘无故地创建了一个新对象。在下一行中将其丢弃。只有在创建新对象时才需要alloc/init,而不是每次声明变量时。
userInfoData = [dataCenter.userInfoList objectAtIndex:0];您正在丢弃刚刚创建的对象,并将一个不同的对象分配给该变量。你没有保留这个不同的对象,所以你不应该释放它。
//do stuff here
[userInfoData release];您正在释放不同的对象,但您并不拥有它,因为您没有保留它。
正确的代码是
UserInfoData *userInfoData = [dataCenter.userInfoList objectAtIndex:0];你不会通过保留它来获得所有权,所以你不会释放它。
https://stackoverflow.com/questions/7167451
复制相似问题