1

我是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: &paramIn];

    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),释放nameandid值是因为

1)它的尾随paramIn字典,并被paramId释放?

或者

2) 两个值都是从paramIn字典中复制的,但没有保留/复制指令

我想,答案是 2),对吧?

Q2。如何保留存储在 NSMutableDictionaries 中的值paramInparamOut

谢谢

4

2 回答 2

1

您的实例变量namein并且out未定义为属性,因此您必须对其保留进行微观管理。如果您不这样做,那么它们将不会在您设置它们的方法范围之外存活很长时间。

最简单的解决方案是为实例变量创建属性:

@property(nonatomic, retain)  NSString *name;
@property(nonatomic, retain)  NSMutableDictionary *in;
@property(nonatomic, retain)  NSMutableDictionary *out;

...然后使用 self 表示法self.name来访问它们。

于 2010-07-29T00:24:20.073 回答
1

如果您没有分配或保留有问题的对象(字符串?),并且是通过另一种方法提供给您的,那么它可能是自动释放的。据我了解,该对象仅保留在释放自动释放池之前(在当前运行循环结束时?)。这将导致调用send:receive:在同一个循环中工作(当在同一个函数中调用它们时),但是当单独调用时,会导致错误,因为对象已被自动释放。

于 2010-07-28T05:11:15.953 回答