2010-07-27 77 views
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 ..)......

我发现,这是存储的数据(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: &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,西蒙,TechZen)

我一直在调试和不断变化的代码...我发现: 以十个分量的名字名称和值ID,我要做的:

name =[[self getParam:@"nameResponse"] copy]; 
id =[[self getParam:@"myId"] copy]; 

问题: Q1。说起旧代码(whitout的copy),该nameid值被释放,因为

1)它的尾巴给paramIn百科,并paramId被释放?

OR

2)这两个值是从paramIn百科复制,但没有保留/复制指令

我想,答案是2),对不对? Q2302。我如何保留存储在NSMutableDictionaries paramInparamOut中的值?

感谢

+2

你是否在任何地方保留数据?您可能想要发布一些代码来显示该对象 – iwasrobbed 2010-07-27 22:44:23

+0

您发布的任何代码都与内存管理无关,因此我们无法真正帮助您解决这个问题。 – Chuck 2010-07-28 00:19:03

+0

鉴于代码不支持这个问题,我会猜测问题在于会计中的Bob。 – NotMe 2010-07-28 05:14:49

回答

1

如果没有的Alloc或有关保留对象(字符串?),并通过其他方法给你,它可能自动释放。据我所知,该对象只在autorelease池被释放之前一直保留(在当前运行循环结束时?)。这将导致调用和receive:在同一个循环工作中(在同一个函数中调用它们时),但是当单独调用时,会导致错误,因为该对象已被自动释放。

+0

是的,我一直在调试和更改代码...我发现: 为了维持名称和id值,我必须这样做: name = [[self getParam: @“nameResponse”] copy]; id = [[self getParam:@“myId”] copy]; – jhon 2010-07-29 17:50:57

1

您的实例变量name,inout未定义为属性,因此您必须对其保留进行微操作。如果你没有,那么它们将不会长久超越你设置它们的方法的范围。

最简单的办法是让属性的实例变量正是如此:

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

...然后使用自符号如self.name来访问它们。

+0

纠正我,如果我错了,但是,将它们定义为属性将使它们可以从课外使用,即: MyClass示例= [[MyClass alloc] init]; NSString * name = example.name; 如果是这样的话,那么我应该保留他们“别的地方”,对吧? – jhon 2010-07-29 17:48:33

+0

无论如何,除非您将它们标记为私人,否则它们在课程外部是可见的,无论您是否在或在何处定义属性。属性实际上只是合成的方法。他们不影响能见度。您必须以某种方式管理iVars的保留。您要么使用@property指令,要么手动编写访问器,要么在执行整个班级代码中的保留时出错。我建议前者。 – TechZen 2010-07-29 18:11:44