Я недавно начал разрабатывать для 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;
}
обычно вы должны использовать ClassName вместо себя, но когда вы находитесь внутри метода класса, вызывающего метод другого класса, я все равно тот же, что и ClassName. – Jsdodgers
'- (void) init {' <- это ваш фактический код? – Sebastian
Да, я не думаю, что это твоя проблема, список вызовов, показанный там, выглядит как-то в методе А, является виновником твоего краха. – Fonix