我是iphone开发世界的新手..我开始了一个新项目,我用它来测试我学到的有关目标c的东西,它基本上是从我的本地服务器发送和接收数据,然后,我在类中存储一些数据,它工作正常。一切都在命令行上。谁在处理程序文件上释放我的对象?
我的类定义:
@interface MyClient : NSObject {
NSString *name;
NSMutableDictionary *in, *out;
}
-(BOOL) send;
-(BOOL) receive;
我成立了“走出去”的价值观,并将其转换为XML,并将它们发送到我的服务器。 我的服务器响应,我得到“in”值 这个名字是一个包含“in”值的特殊值的字符串。
当我尝试将我的代码与我在互联网上找到的一些示例/演示混合使用时,问题出现了,演示会带来一些MVC?文件(* Handler.h/m,* ViewController.h/m,* AppDelegate.h/m)。有一个按钮(btnStart),如果我按下该按钮调用
- (IBAction) start: (id) sender;
一切工作正常,如果我把发送和接收start方法调用里面。
但是...
我尝试了两种有按钮:发送和接收,这两部作品(我曾尝试他们和发送输出到控制台),这两种方法是:
1) - (IBAction) send: (id) sender;
2) - (IBAction) receive: (id) sender;
两个内* Handler.m
然后: 方法1)将执行[myClient send];方法2)将执行[myClient receive];
这是行不通的,它引发了我一个“BAD_ACCESS”的错误,我调试(我用NSZombie ..)......
我发现,这是存储的数据(IN,OUT名)时,被称为[myClient发送]被释放/杀死/当调用[myClient接收]时不存在
我还没有调用[myClient release]或类似的东西。
问题: 我在做什么错? 该代码(方法1)和2))应该在哪里?
谢谢。
更新: 下面是一些代码,这是巨大的,所以我必须粘贴的有意义的部分副本&,让我知道如果你需要更多的代码,谢谢!
// MyClass.h
@interface MyClient : NSObject {
NSString *name;
NSString *id;
NSMutableDictionary *paramIn, *paramOut;
}
-(BOOL) send;
-(BOOL) receive;
-(void) setParam:(NSString *) key value: (NSString *) value;
-(NSString *) getParam:(NSString *) key;
//MyClass.m
#import "MyClass.h"
#import "TBXML.h"
@implementation MyClass
-(id) init {
if (!(self= [super init])){
return nil;
}
paramIn=[[NSMutableDictionary alloc] init] ;
paramOut=[[NSMutableDictionary alloc] init] ;
return self;
}
-(void) setParam:(NSString *) key value: (NSString *) value {
[paramOut setObject:value forKey:key];
}
-(NSString *) getParam:(NSString *) key {
return [paramIn objectForKey:key];
}
-(BOOL) send{
NSString *xml=[self getXML];
// url conection ...
// NSURLReq ...
NSData *data= [ buffer dataUsingEncoding: NSASCIIStringEncoding];
TBXML * tbxml = [[TBXML tbxmlWithXMLData: data] retain];
BOOL r=[self getXML: tbxml usingThisDictionary: ¶mIn];
if (r == YES) {
name = [self getParam:@"nameResponse"];
id =[self getParam:@"myId"];
}
[xml release];
[data release];
[tbxml release];
return r;
}
-(BOOL) getXML:(TBXMLElement *)element usingThisDictionary:(NSMutableDictionary **) map {
// search for each element...
if (someError) return NO;
[*map setObject: [TBXML attributeValue:attribute] forKey:[TBXML elementName:element]];
return YES;
}
@end
更新: 感谢球员(IwasRobbed,西蒙,TechZen)
我一直在调试和不断变化的代码...我发现: 以十个分量的名字名称和值ID,我要做的:
name =[[self getParam:@"nameResponse"] copy];
id =[[self getParam:@"myId"] copy];
问题: Q1。说起旧代码(whitout的copy
),该name
和id
值被释放,因为
1)它的尾巴给paramIn
百科,并paramId
被释放?
OR
2)这两个值是从paramIn
百科复制,但没有保留/复制指令
我想,答案是2),对不对? Q2302。我如何保留存储在NSMutableDictionaries paramIn
和paramOut
中的值?
感谢
你是否在任何地方保留数据?您可能想要发布一些代码来显示该对象 – iwasrobbed 2010-07-27 22:44:23
您发布的任何代码都与内存管理无关,因此我们无法真正帮助您解决这个问题。 – Chuck 2010-07-28 00:19:03
鉴于代码不支持这个问题,我会猜测问题在于会计中的Bob。 – NotMe 2010-07-28 05:14:49