Nano Hash - криптовалюты, майнинг, программирование

Установка делегата вызывает сбой

Я вызываю NSObject из UIViewController и устанавливаю контроллер представления в качестве делегата NSObject.

Когда этот код выполняется, приложение полностью завершает работу в симуляторе из-за EXC_BAD_ACCESS (как это применимо здесь?). Когда приложение запускается на реальном устройстве, оно аварийно завершает работу при третьем выполнении кода. Вывод реального журнала устройства приведен ниже:

(First time)
2012-04-01 13:29:05.154 The Record[19044:707] Done

----
(Second time)
2012-04-01 13:29:06.274 The Record[19044:707] Done

----
(Third time)
2012-04-01 13:29:07.772 The Record[19044:707] -[ViewController setDelegate:]: unrecognized selector sent to instance 0xde2e6e0
2012-04-01 13:29:07.773 The Record[19044:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[ViewController setDelegate:]: unrecognized selector sent to instance 0xde2e6e0'
*** First throw call stack:
(0x3211088f 0x37515259 0x32113a9b 0x32112915 0x3206d650 0x537f7 0x4f82b 0x3206a3fd 0x379eafaf 0x37ab076b 0x3206a3fd 0x379eafaf 0x379eaf6b 0x379eaf49 0x379eacb9 0x379eb5f1 0x379e9ad3 0x379e94c1 0x379cf83d 0x379cf0e3 0x3144322b 0x320e4523 0x320e44c5 0x320e3313 0x320664a5 0x3206636d 0x31442439 0x379fde7d 0x4dd8d 0x4dd38)
terminate called throwing an exception(lldb)

Я просто вызываю NSObject и устанавливаю контроллер представления в качестве делегата.

Authorization *authorization = [[Authorization alloc] init];
authorization.delegate = self;

Когда я убираю authorization.delegate = self;, приложение не падает, но мне явно нужна эта строка.

Изменить: вот код. Я использую @protocol. Авторизация.ч:

#import <Foundation/Foundation.h>
#import "KeychainItemWrapper.h>

@protocol AuthorizationDelegate <NSObject>
- (void)done:(BOOL *)done downloadURL:(NSURL *)downloadURL username:(NSString *)username password:(NSString *)password reason:(NSString *)reason;
@end

@interface Authorization : NSObject {

    id<AuthorizationDelegate> delegate;
    KeychainItemWrapper *keychain;

}

-(id)init;

@property (nonatomic, assign) id<AuthorizationDelegate> delegate;

@end

----
//Authorization.m

#import "Authorization.h"
#import "ASIFormDataRequest.h"
#import "JSON.h"

@implementation Authorization

@synthesize delegate;

-(id)init {

    keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"exampleID" accessGroup:nil];
    NSString *passPhrase = [keychain objectForKey:(id)kSecValueData];


    // Start request
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"https://www.website.com/authorization.php"]];
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
    [request setPostValue:passPhrase forKey:@"passphrase"];
    [request setPostValue:@"YES" forKey:@"receivingAuthorization"];
    [request setDidFinishSelector:@selector(requestFinished:)];
    [request setDidFailSelector:@selector(requestFailed:)];
    [request setDelegate:self];
    [request startAsynchronous];

}

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

    if (request.responseStatusCode == 200) {

        NSString *responseString = [request responseString];
        NSDictionary *responseDict = [responseString JSONValue];
        NSString *downloadString = [responseDict objectForKey:@"downloadURL"];
        NSString *username = [responseDict objectForKey:@"username"];
        NSString *password = [responseDict objectForKey:@"password"];

        if ((downloadString != nil) && (username != nil) && (password != nil)) {

            NSURL *downloadURL = [NSURL URLWithString:downloadString];

            [delegate done:YES downloadURL:downloadURL username:username password:password reason:@"Received Authorization"];

         } else {

            [delegate done:NO downloadURL:nil username:nil password:nil reason:@"Invalid Request"];

        }

    } else if (request.responseStatusCode == 400) {

        if ([[request responseString] compare:@"Invalid passphrase"] == 0) {

            [delegate done:NO downloadURL:nil username:nil password:nil reason:@"Incorrect Credentials"];

        } else if ([[request responseString] compare:@"Invalid request"] == 0) {

            [delegate done:NO downloadURL:nil username:nil password:nil reason:@"Invalid Request"];

        }

    } else {

        [delegate done:NO downloadURL:nil username:nil password:nil reason:@"Invalid Request"];

    }

}

@end


----

//ViewController.h

@interface ViewController : UIViewController <IssuesPickerDelegate, IssueTableDelegate, AuthorizationDelegate> {

    Authorization *authorization;

}

@property (nonatomic, retain) Authorization *authorization;

----

//ViewController.m

@synthesize authorization;

-(void)done:(BOOL *)done downloadURL:(NSURL *)downloadURL username:(NSString *)username password:(NSString *)password reason:(NSString *)reason {

NSLog(@"Done");

if ((done == YES) && ([reason compare:@"Received Authorization"] == 0)) {


} else if ([reason compare:@"Incorrect Credentials"] == 0) {

    Login *login = [[Login alloc] init];

}

}


-(void)getAuthorization {

//this part here causes the crash

authorization = [[Authorization alloc] init];
authorization.delegate = self;

}

  • В сообщении об ошибке говорится, что происходит сбой из-за установки делегата в классе с именем ViewController, но вы говорите, что это класс Authorization. Можно уточнить/пояснить? 01.04.2012
  • Пожалуйста, опубликуйте свой код, просто мы можем вам помочь. 01.04.2012
  • @ParthBhatt Я смотрю на эту ссылку. Дайте мне одну секунду, ребята! 01.04.2012
  • @JackHumpries: Правильно ли вы создали свойство @property и @synthesize, то есть, и синтезировали объявление своего делегата? Если это вам не поможет. Пожалуйста, опубликуйте свой код, чтобы мы могли лучше вам помочь. 01.04.2012
  • @JackHumpries: Вы ссылались на мою ссылку? stackoverflow.com/questions/4360372/ 01.04.2012
  • Что такое подкласс авторизации? Кажется, что ваш класс является подклассом UIViewController. Ваш класс не реализует метод делегата. Что вы пытаетесь сделать именно? это ссылка на Ссылка на класс UIViewController 01.04.2012
  • @ParthBhatt Я разместил свой код. Спасибо. 01.04.2012
  • @Parth: @required используется по умолчанию, если явно не указана директива. 01.04.2012
  • @ParthBhatt Я вставил @required прямо под @protocol AuthorizationDel.... Это ничего не изменило. На реальном устройстве все работает, как и ожидалось, до третьего раза, когда оно падает, и я получаю сообщение в журнале. 01.04.2012
  • @lulius: Хорошо, извини, мой плохой. Я забыл об этом. 01.04.2012
  • @JackHumpries: я не думаю, что в этой части кода есть какие-то проблемы. Пожалуйста, отправьте код для класса авторизации 01.04.2012
  • @ParthBhatt Я только что опубликовал все это. 01.04.2012
  • @JackHumphries: поставьте точку останова в методе init класса Authorization и отлаживайте строку за строкой, особенно в третий раз, потому что именно тогда он действительно дает сбой, верно? 01.04.2012
  • Я предлагаю вам переименовать делегата id‹AuthorizationDelegate› в id‹AuthorizationDelegate› authDelegate, чтобы избежать двусмысленности и четкого понимания. 01.04.2012
  • не могли бы вы опубликовать вывод отладчика: po 0xde2e6e0 02.04.2012
  • @elio.d elio.d Конечно, как именно я могу это сделать? Я выложил лог выше, если это одно и то же. Спасибо. 02.04.2012
  • Я только что отправил это как TSI в Apple. Мне нужно получить доступ к этому коду авторизации из нескольких мест в приложении, поэтому размещение его в ViewController (следовательно, устранение делегата) не подойдет. Я дам вам знать, в чем проблема, как только мы ее решим. 03.04.2012

Ответы:


1

Я забыл вернуть значение из -(id)init. Я возвращаюсь self. Мой новый код -(id)init ниже.

-(id)init {

    self = [super init];

    keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"exampleID" accessGroup:nil];
    NSString *passPhrase = [keychain objectForKey:(id)kSecValueData];         

    // Start request
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"https://www.website.com/authorization.php"]];
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
    [request setPostValue:passPhrase forKey:@"passphrase"];
    [request setPostValue:@"YES" forKey:@"receivingAuthorization"];
    [request setDidFinishSelector:@selector(requestFinished:)];
    [request setDidFailSelector:@selector(requestFailed:)];
    [request setDelegate:self];
    [request startAsynchronous];

    return self;

}
03.04.2012
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..