2013-07-06 5 views
1

Я инициализировал пользовательский класс из другого класса, затем я хочу запустить функцию из пользовательского класса, и когда это будет сделано, вызовите метод из класса, который его инициализировал.Метод вызова из родительского класса

// classA.m 

-(void)methodA { 
    // do some complicated stuff 
    if (result) { 
     [classB methodB]; 
    } 
} 

// classB.m  

-(void)methodA { 
    classAInstance = [[classA alloc] init]; 
    [classAInstance methodA]; 
} 

-(void)methodB { 
    // got result, do more stuff 
} 

[classB methodB] не работает, но я понятия не имею, как это будет достигнуто, так что любая помощь будет принята с благодарностью, спасибо.

+0

То, как вы его написали, не будет работать. Вам нужно будет изменить маленький '-' в classB: methodB на '+' для метода класса. – JiuJitsuCoder

ответ

1

Я думаю, что есть что-то очень важно, что в настоящее время забывают здесь другие плакаты: сохранить циклы. Любой дочерний метод, который пытается ссылаться на его родительский объект, должен сделать это со слабой ссылкой или модификатором __unsafe_unredtained.Если вы этого не сделаете, вы рискуете, что родительский объект пойман в цикле удержания. Если я понимаю вопрос, вы просто хотите вызвать метод в объекте класса «А», когда определенный метод заканчивается в объекте класса «В»? Обычно я делаю это одним из двух способов: делегатами и протоколами (более сложная концепция) или NSNotificationCenter (менее сложная концепция). В вашем случае, поскольку вы просто пытаетесь «уведомлять» об одном методе, когда заканчивается другой метод в другом классе, центр уведомлений кажется, что его гораздо проще использовать. Существует довольно хороший учебник здесь: http://blog.isotoma.com/2009/11/on-objective-c-delegates-and-nsnotification-objects/, но вот основная предпосылка:

В методе делает работу (в классе В) в конце метода вставить что-то вроде этого:

NSNotification* notification = [NSNotification notificationWithName:@"MyNotification" object:self]; 
[[NSNotificationCenter defaultCenter] postNotification:notification]; 

Тогда в классе метод инициализации вы бы зарегистрироваться для получения этого уведомления:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(MethodToCallAfterNotification:) name:@"MyNotification" object:nil]; 

Всякий раз, когда метод класса B заканчивается, он будет транслировать уведомления «MyNotification». Ваш объект класса А прослушивает эти уведомления, поэтому он будет автоматически вызывать какой бы селектор вы назначили, когда это уведомление транслируется в вашем приложении.

Просто убедитесь, что создать метод dealloc в классе Файл реализации и разрегистрировать наблюдатель, как это:

[[NSNotificationCenter defaultCenter] removeObserver:self name:@"MyNotification" object:nil]; 

Если вы заинтересованы в том, как сделать это с помощью слабого ссылочного метода делегата вызова, Я написал ответ об этом здесь: https://stackoverflow.com/a/10273551/1318525

+0

Подход NotificationCenter отлично работал, спасибо. – amba88

0
#classA.m 

-(void)methodA:(classB *)classB { 

#classB.m  

[classAInstance methodA:self]; 
0

Перед вызовом метода вы должны инициализировать объект класса вызывать явный метод ... вроде как

// classA.m 
- (void)somethingA{ } 

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

// classB.m 
+ (void)somthingB {} 
2

I'm new to objective-c so please bare with me.

Я буду надеть свою одежду для этого - если вы не возражаете.

Одним из способов достижения желаемого является «композиция», что означает запись A, так что она имеет переменную-член, являющуюся экземпляром B. Тогда A может использовать этот экземпляр B для вызова методов в B:

Ач

#import <Cocoa/Cocoa.h> 
#import "B.h" 

@interface A : NSObject { 
    B* my_b; 
} 
- (id)init:(B*)b; 
- (void)methodA; 

@end 

.

a.m:

#import "A.h" 

@implementation A 

- (id)init:(B*)b 
{ 
    if (![super init]) 
    { 
     return nil; 
    } 

    my_b = b; 

    return self; 
} 

- (void)methodA 
{ 
    [my_b methodB]; 
} 

@end 

.
B.h:

#import <Cocoa/Cocoa.h> 

@interface B : NSObject { 

} 
- (void)do_stuff; 
- (void)methodB; 

@end 

.
Bm:

#import "B.h" 
#import "A.h" 

@implementation B 

- (void)do_stuff 
{ 
    A* a = [[A alloc] init:self]; 
    [a methodA]; 
} 

- (void)methodB 
{ 
    NSLog(@"hello"); 
} 

@end 

===

Поскольку Вы писали:

[classB methodB]; 

... может быть, вы хотите, чтобы вызвать метод класса в В.

Ач:

#import <Cocoa/Cocoa.h> 
#import "B.h" 

@interface A : NSObject { 

} 
- (void)methodA; 

@end 

a.m:

#import "A.h" 
#import "B.h" 

@implementation A 

- (void)methodA 
{ 
    [B classMethodB]; 
} 

@end 

B.h:

#import <Cocoa/Cocoa.h> 

@interface B : NSObject { 

} 
+ (void)classMethodB; 
- (void)do_stuff; 

@end 

B.m:

#import "B.h" 
#import "A.h" 

@implementation B 

- (void)do_stuff 
{ 
    A* a = [[A alloc] init]; 
    [a methodA]; 
} 


+ (void)classMethodB //Note the '+' 
{ 
    NSLog(@"hello"); 
} 

@end 
+0

Я пробовал это, но я получаю сообщение об ошибке в строке '[my_b methodB];' '' '' 'Тип сообщения 'B', например, сообщение является объявлением вперед''. – amba88

+0

Вам нечего импортировать. – 7stud

+0

Если я импортирую Bh в Ah Я получаю ошибку 'ld: 1 дубликат символа для архитектуры armv7 clang: ошибка: команда компоновщика не сработала с кодом выхода 1 (используйте -v для вызова вызова)' – amba88

Смежные вопросы