我是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