我是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 ..)......
我发现调用 [myClient send] 时存储的数据(输入、输出、名称)在调用 [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、Simon、TechZen)
我一直在调试和更改代码......我发现:为了保持名称名称和id值,我必须这样做:
name =[[self getParam:@"nameResponse"] copy];
id =[[self getParam:@"myId"] copy];
问题:Q1。谈论旧代码(没有copy
),释放name
andid
值是因为
1)它的尾随paramIn
字典,并被paramId
释放?
或者
2) 两个值都是从paramIn
字典中复制的,但没有保留/复制指令
我想,答案是 2),对吧?
Q2。如何保留存储在 NSMutableDictionaries 中的值paramIn
和paramOut
?
谢谢