私はiPhone開発の世界の初心者です。
私は新しいプロジェクトを開始し、Objective cについて学んだことをテストするために使用しました。基本的に、ローカルサーバーからデータを送受信し、そのデータの一部をクラス内に保存します。正常に機能します。すべてがコマンドラインにあります。
私のクラス定義:
@interface MyClient : NSObject {
NSString *name;
NSMutableDictionary *in, *out;
}
-(BOOL) send;
-(BOOL) receive;
「out」値を設定し、それらをxmlに変換して、サーバーに送信します。サーバーが応答します。「in」値を取得します。名前は「in」値の特別な値を含む文字列です。
問題は、コードをインターネットで見つけたいくつかの例/デモと混合しようとすると発生します。デモはいくつかのMVCをもたらしますか?ファイル(* Handler.h / m、* ViewController.h / m、* AppDelegate.h / m)。ボタンが1つあり(btnStart)、そのボタンを押すと呼び出されます
- (IBAction) start: (id) sender;
startメソッド内にsendおよびreceive呼び出しを配置すると、すべてが正常に機能します。
しかし...
私は2つのボタンを試してみました:送信と受信、両方が機能します(私はそれらを試してコンソールに出力を送信しました)、両方の方法は次のとおりです:
1) - (IBAction) send: (id) sender;
2) - (IBAction) receive: (id) sender;
両方とも*Handler.m内
次に:メソッド1)は[myClientsend]を実行するだけです。メソッド2)は[myClientreceive]を実行するだけです。
それは機能しません、それは私に「BAD_ACCESS」エラーを投げます、私はデバッグしました(私はNSZombieを使用しました..)..。
[myClient send]を呼び出すと保存されるデータ(in、out、name)が解放/強制終了/[myClientreceive]を呼び出すと存在しないことがわかりました
[myClientリリース]などとは呼んでいません。
質問:私は何が間違っているのですか?そのコード(方法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
andのid
値が解放されます。
1)paramIn
辞書に合わせてparamId
リリースされますか?
また
2)両方の値がparamIn
辞書からコピーされますが、保持/コピーの指示はありません
答えは2)だと思いましたよね?
Q2。NSMutableDictionariesparamIn
に保存されている値を保持するにはどうすればよいparamOut
ですか?
ありがとう