2010-07-27 17 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