iphone - クラスインスタンスで呼び出されないデリゲートメソッド

iphone delegates amazon-s3 subclass

1つのメソッドと4つのデリゲートメソッドを持つS3ObjectController(S3OC)というクラスのインスタンスを作成しています。 S3OCのインスタンスを作成し、S3OCクラスからインスタンスメソッドを呼び出します(これはNSLogステートメントから発生することがわかっています)が、関連するデリゲートメソッドはS3OCクラス内で呼び出されません。メソッドでデリゲートをselfに設定し、デリゲートを.hヘッダーで適切に宣言しています。

考え?明確にするために、それは呼び出されるべきではないと私が考えている以下の.mファイル内の(void)requestメソッドです。 EXC BAD ACCESSエラーが発生します。 ARCから自己解放されますか?

S3OCクラスの.mファイル全体を以下に示します。

#import "S3ObjectController.h"

@implementation S3ObjectController
@synthesize string;
@synthesize s3GOR, s3Client;

-(void)method
{
    NSLog(@"Method Called");
    s3Client = [[AmazonS3Client alloc] initWithAccessKey:ACCESS_KEY_ID withSecretKey:SECRET_KEY];
    s3GOR = [[S3GetObjectRequest alloc]initWithKey:string withBucket:[Constants pictureBucket]];
    [s3GOR setDelegate:self];
    [s3Client getObject:s3GOR];
    NSLog(@"Method Finished");
}

-(void)request:(AmazonServiceRequest *)request didFailWithError:(NSError *)error
{
    NSLog(@"Error %@",error);
}

-(void)request:(AmazonServiceRequest *)request didReceiveResponse:(NSURLResponse *)response 
{
    NSLog(@"Response Key %@", response);
}

-(void)request:(AmazonServiceRequest *)request didReceiveData:(NSData *)data
{
    NSLog(@"ObjectRequestKey = %@",request);
}

-(void)request:(AmazonServiceRequest *)request didCompleteWithResponse:(AmazonServiceResponse *)response
{
    NSLog(@"Final Delegate Method");
}


ヘッダーは次のとおりです。」

@interface S3ObjectController : NSObject <AmazonServiceRequestDelegate>{
    NSMutableData *responseData;
    NSString *string;

    AmazonS3Client *s3Client;
    S3GetObjectRequest *s3GOR;
}

-(void)method;

@property (nonatomic, strong)  NSString *string;
@property (nonatomic, strong) S3GetObjectRequest *s3GOR;
@property (nonatomic, strong) AmazonS3Client *s3Client;

@end


最後に、別のクラスでメソッドを呼び出す方法を次に示します。

for (NSString *name in nameArray){
        @try {
            S3ObjectController *localS3 = [[S3ObjectController alloc]init];
            localS3.string = name;
            [localS3 method];
            NSLog(@"called");
}
答え
ARCに対するあなたの疑いは本当だと思います。デリゲートプロパティは通常弱い参照であるため、オブジェクトが解放されないようにするのに十分ではありません。

iVarであるNSArrayを作成し、それにS3ObjectControllerを追加します。それでもデリゲートが発砲しない場合は、それが別の何かであることがわかります...

編集:

forループを含むクラスのヘッダーでNSMutableArrayを宣言し、次のように初期化します。

myArray = [NSMutableArray arrayWithCapacity:0];


次に、次のように使用します。

for (NSString *name in nameArray){
@try {
        S3ObjectController *localS3 = [[S3ObjectController alloc]init];
        localS3.string = name;
        [localS3 method];
        [myArray addObject:localS3];
        NSLog(@"called");
     }
}
関連記事

iphone - サーバーのない1つのWi-Fiネットワーク内のiOSアプリ間の通信

iphone - NSCoderを使用して静的シングルトンオブジェクトを初期化する

iphone - drawRectの伸縮可能な画像が原因でスクロールが遅くなる

iphone - Parsekit:個々の引用文字を一致させる方法は?

iphone - iPhone-低メモリ状態に対処する方法

iphone - プログラムでキーボードを閉じるにはどうすればよいですか?

iphone - デバイスがxcodeオーガナイザーウィンドウで認識されない

iphone - シーケンシャルUIView変換

iphone - UITextFieldsにテキストが追加されたときに、UIReturnKeyGoとUIReturnKeyNextを切り替えるにはどうすればよいですか?

c# - UITableViewでランダムに「NIBをバンドルでロードできませんでした」