0

WebサービスとiOSアプリケーションがあります。ヘッダーを使用 ASIHTTPRequest.h, ASIFormDataRequest.hして、phpスクリプト/mysqlデータベースへの接続を処理します

ビューコントローラーの1つで、Webサービスに複数の要求を送信し、各応答を処理する必要があります。また、ビューコントローラーのビューとメソッドは、各要求の後に更新する必要があります。

ASIHTTPRequestイベントが1つしかないため、リクエストを処理するため(void)requestFinished:(ASIHTTPRequest *)requestに内部のブロックで応答を処理する必要があり(void)requestFinished:(ASIHTTPRequest *)requestます。文字列を使用できる可能性があり、リクエストが終了すると、次のコードを記述したifステートメントでこの文字列を使用できます。 requestfinishメソッドの条件が機能しませif ([checkRequest rangeOfString:@"like"].location != NSNotFound)

VoteMe.h

@interface VoteMe : UIViewController<UITextFieldDelegate>{
 NSMutableString  *checkRequest;
}
@property (retain, nonatomic) NSMutableString  *checkRequest;

投票.m

@synthesize checkRequest;
- (void)viewDidLoad
{
 [self showPicture];
}

-(void)showPicture
 {
     checkRequest =[NSMutableString stringWithString:@"showPicture"];

     //request a random picture url, from server
     NSURL *url = [NSURL URLWithString:showpicture];
     ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];

     [request setDelegate:self];
     [request startAsynchronous];
} 
-(IBAction)voteLike:(id)sender{

    checkRequest =[NSMutableString stringWithString:@"like"];

    NSURL *url = [NSURL URLWithString:voteup];
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];

    [request setDelegate:self];
    [request startAsynchronous];

    [self showPicture];

}
- (void)requestFinished:(ASIHTTPRequest *)request
{    

    if ([checkRequest rangeOfString:@"like"].location != NSNotFound) {
     //do smth
     }

    if ([checkRequest rangeOfString:@"showPicture"].location != NSNotFound) {
    //do someth else
    }
}

上記のコードの問題-(IBAction)voteLike:(id)senderは、呼び出されたときにの文字列checkRequestを「like」に変更することになっているため、ASIFormDataRequest条件が適切に機能する場合は、の応答が到着したときに

ブレークポイントでは、checkRequestが表示されますVariable is not a CFString

Nsstring代わりに使用した場合NSMutableStringも同じ結果になります

後でretain文字列が必要になることはわかっていますが、それでも必要な場合は使用しないでくださいreleaseallocretain/release

どうすれば目標を達成できますか?上記のステートメントまたは修正NSStringNSmutableString問題かどうかを確認するためのより良い解決策がありますか?

4

2 に答える 2

2

何かをプロパティ(checkRequest)として定義するときは、そうしない非常に正当な理由self.checkRequestがない限り、コードでそれを参照するときに使用します。変数に直接アクセスすると、プロパティステートメントに設定した属性は無視されます。

于 2012-07-03T21:51:41.587 に答える
1

リクエストが終了したときにcheckRequestが文字列ではない理由は、リクエストを保持することがないため、リクエストが解放されるためです。保持プロパティを作成しましたが、インスタンス変数に直接アクセスしている場合は使用されません。

プロパティを使用してcheckRequestを保持するには、次のように記述する必要があります。

self.checkRequest = [NSMutableString stringWithString:@"like"];
于 2012-07-03T21:52:56.920 に答える