2013-03-20 4 views
-4

Я недавно начал разрабатывать для iPhone и, следовательно, Objective C, поступающий с Java. Поэтому я хочу заранее извиниться за это, вероятно, это вопрос о нобе :)Objective C, используя класс-методы

У меня возникли проблемы с получением одобрения моего приложения в App Store. Мое приложение отлично работает при использовании симулятора или моего iPhone, но по какой-то причине оно, похоже, падает в Купертино.

Я думаю (надеюсь) Я знаю, в чем проблема, но я просто хочу проверить, прежде чем загружать новую версию и ждать еще неделю, прежде чем снова разочароваться.

В любом случае, я использую методы класса, что-то из того, что я понял, похоже, но не так, как статические java-методы.

Вот как я загрузил приложение.

@implementation AlphaClass 

-(void) initProgram{ 
    NSString * value = [BetaClass methodB]; 
} 

@end 


@implementation BetaClass 

    +(NSString*) methodA{ 
     //DO STUFF THEN RETURN 
    } 

    +(NSString*) methodB{ 
     NSString *value = [self methodA]; 
     //DO MORE STUFF THEN RETURN 
    } 

@end 

Это, по-видимому, судорожно, даже я не могу повторить крушение.

Exception Type: EXC_BAD_ACCESS (SIGSEGV) 
Exception Codes: KERN_INVALID_ADDRESS at 0x432b2b10 
Crashed Thread: 0 

Thread 0 name: Dispatch queue: com.apple.main-thread 
Thread 0 Crashed: 
0 libobjc.A.dylib     0x3a3c3526 objc_retain + 6 
1 Appname      0x0008928a +[BetaClass methodA] + 418 
2 Appname      0x000894de +[BetaClass methodB] + 170 
3 Appname     0x000908f6 __44-[AlphaClass initProgram]_block_invoke + 362 

Итак, из того, что я понял, я должен изменить «я» на имя класса. поэтому код должен выглядеть так.

@implementation BetaClass 
    +(NSString*) methodA{ 
     //DO STUFF THEN RETURN 
    } 

    +(NSString*) methodB{ 
     NSString *value = [BetaClass methodA]; 
     //DO MORE STUFF THEN RETURN 
    } 
@end 

Опять же, я мог бы быть полностью утрачена, пожалуйста, дайте мне знать, если я нахожусь на правильном пути

Спасибо за любые ответы.

Редактировать. это как Methoda выглядеть

+(NSString*) methodA{ 
    NetworkStatus netStatus = [[Reachability reachabilityForInternetConnection]currentReachabilityStatus]; 
    if(netStatus == NotReachable) 
    { 
     return NETWORK_ERROR; 
    } 


    @try 
    { 

     DynamoDBGetItemRequest *request = [[DynamoDBGetItemRequest alloc] initWithTableName:TABLE_CONTENT 
                        andKey:[[DynamoDBKey alloc] initWithHashKeyElement: 
                          [[DynamoDBAttributeValue alloc] initWithS:[ItemHelpClass getItem]]]]; 

     DynamoDBGetItemResponse *response = [[AmazonClientManager ddb] getItem:request]; 
     if(response){ 
      if(((DynamoDBAttributeValue *)[response.item objectForKey:@"UID_ID"]).s){ 
       return ITEM_BORROWED; 
      } 
      else{ 
       return ITEM_NOT_BORROWED; 
      } 
     } 

    }@catch (NSException *exception) 
    { 
     [AmazonClientManager wipeCredentialsOnAuthError:exception]; 
    } 
    return NETWORK_ERROR; 

} 
+0

обычно вы должны использовать ClassName вместо себя, но когда вы находитесь внутри метода класса, вызывающего метод другого класса, я все равно тот же, что и ClassName. – Jsdodgers

+1

'- (void) init {' <- это ваш фактический код? – Sebastian

+0

Да, я не думаю, что это твоя проблема, список вызовов, показанный там, выглядит как-то в методе А, является виновником твоего краха. – Fonix

ответ

1

Вы уверены, что это так, что вы вызываете методы, что это вопрос, а не то, что они содержат?

Несколько вопросов, которые могут помочь.

1) Являются ли возвращенные строки статическими или являются динамическими?

NSString *string = @""; //Static 

VS

NSString *string = [NSString stringWithFormat:@"%@",[NSArray objectAtIndex:0]]; // Dynamic 

Если это динамический и вход нуль он может врезаться, например, пытается получить индекс из пустого массива.

2) Есть ли какие-либо условия, при которых одна из строк может быть возвращена без инициализации?

NSString *string; // Not Initialized 

VS

NSString *string = @""; // Initialized 

EDIT *

Кроме того, теперь, когда я вижу код, указанный выше, почему вы делаете @try @catch?

Это может сработать на PHP, но в iOS это не путь. Прямо из документов Apple.

«Вы не должны использовать примерочные поймать блок вместо стандартного программирования проверки для методов Objective-C. В случае NSArray для Например, вы всегда должны проверить Подсчитайте массив, чтобы определить Число элементов, прежде чем пытаться получить доступ к объекту по заданному индексу. Метод objectAtIndex: выдает исключение, если вы делаете запрос об отсутствии , чтобы вы могли найти ошибку в своем коде в начале в цикле разработки - вы должны избегать исключения исключений в приложении , которое вы отправляете пользователям ».

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/ProgrammingWithObjectiveC/ErrorHandling/ErrorHandling.html

+0

этот вызов может возвращать nil (((DynamoDBAttributeValue *) [response.item objectForKey: @ "UID_ID"]). S), так может ли это быть проблемой? – M3rd0n

+0

Вы не должны возвращать нильские строки из метода, поэтому убедитесь, что вы проверяете свой результат перед его возвратом. –

+0

Ответ Отредактировано для отражения новой информации. –

0

Я не знаю, если это то, что причиной аварии на Apple, но ваш пример кода выше, имеет большую ошибку в нем:

-(void) init{ 
    NSString * value = [BetaClass methodB]; 
} 

init определяется по умолчанию на NSObject, чтобы вернуть волшебный объект Objective-C id. Вы переопределили его и установили, чтобы он возвращал void. Я предполагаю, что крах в Apple происходит, потому что что-то в вашем приложении вызывает ваш метод init, ожидая, что он что-то вернет, а это не так. Таким образом, он получает все, что есть в стеке, скорее всего, указатель на мусор и бум, сбой.

Если вы собираетесь переопределить init, вы должны убедиться, что вы звоните super, используя идиомы вроде этого:

-(id) init { 
    self = [super init]; 
    if (self != nil) { 
     // your initialization stuff here 
    } 
    return self; 
} 
+0

oh ... извините, что имя не init ... должно быть, хотя об этом будет использовано NSObject ... просто используется для использования init как имя в Java – M3rd0n

+5

, вы тратите свои и чужие времена, если вы фактически не вставляете реальный код из своего приложения. – Rog

+0

Извините за имя init, я переименовал метод для простоты, но сделал эту ошибку вместо этого, создав путаницу. Я не переопределяю метод init NSObject. Я только что отредактировал сообщение и ввел код для метода. – M3rd0n