1

私は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: &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古いコード(なし)について話すと、 nameandのid値が解放されます。

1)paramIn辞書に合わせてparamIdリリースされますか?

また

2)両方の値がparamIn辞書からコピーされますが、保持/コピーの指示はありません

答えは2)だと思いましたよね?

Q2。NSMutableDictionariesparamInに保存されている値を保持するにはどうすればよいparamOutですか?

ありがとう

4

2 に答える 2

1

インスタンス変数nameinおよびoutはプロパティとして定義されていないため、それらの保持を細かく管理する必要があります。そうしないと、設定したメソッドの範囲を超えて長く存続しません。

最も簡単な解決策は、インスタンス変数のプロパティを次のように作成することです。

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

...そして、自己表記を使用して、self.nameそれらにアクセスします。

于 2010-07-29T00:24:20.073 に答える
1

問題のオブジェクト (文字列?) を割り当てたり保持したりせず、別の方法で渡された場合、おそらく自動解放されます。私が理解していることから、オブジェクトは、自動解放プールが解放されるまで (現在の実行ループの最後に?) のみ保持されます。これにより、呼び出しsend:receive:同じループ作業が発生します (同じ関数でそれらを呼び出す場合) が、オブジェクトが自動解放されているため、個別に呼び出すとエラーが発生します。

于 2010-07-28T05:11:15.953 に答える