Методы делегата, не вызванные в экземпляре класса - PullRequest
2 голосов
/ 23 января 2012

Я создаю экземпляр класса с именем S3ObjectController (S3OC), который имеет один метод и четыре метода делегата. Я создаю экземпляр моего S3OC, вызываю метод экземпляра из класса S3OC (который, как я знаю, запускается из операторов NSLog), но ни один из связанных методов делегата не вызывается в классе S3OC. У меня в методе установлен делегат self, а в заголовке .h делегат объявлен правильно.

Мысли? просто чтобы быть понятным, это (void) методы запроса в файле .m ниже, я думаю, должны быть вызваны, которые не. Я получаю ошибки EXC BAD ACCESS. ARC освобождает себя?

Весь файл .m класса S3OC представлен ниже:

#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");
}

1 Ответ

2 голосов
/ 27 января 2012

Я думаю, что ваши подозрения в отношении ARC верны.Поскольку свойства делегатов обычно являются слабыми ссылками, их недостаточно для предотвращения освобождения объекта.

Создайте NSArray, который является iVar, и добавьте к нему S3ObjectController.Если делегаты по-прежнему не запускаются, вы знаете, что это что-то еще ...

Edit:

, поэтому объявите NSMutableArray в заголовке класса, который содержит цикл for, инициализируйте его где-нибудькак это:

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");
     }
}
...