нераспознанный селектор отправлен на экземпляр 0x10010c730-> Цель C - PullRequest
0 голосов
/ 21 мая 2011

Я новичок в программировании. Я видел этот код. Возвращение объекта производного класса в базовый класс. Так что базовый класс может затем указывать на методы производного класса. Здесь статическая функция в классе B возвращает свой объект в базу класс.

База-derivedclass.m

#import <Foundation/Foundation.h>
#import "B.h"
int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    [B p]; 
    [pool drain];
    return 0;
}

хиджры

#import <Foundation/Foundation.h>


@interface A : NSObject {

}
@end

a.m

#import "A.h"

@implementation A
 @end

B.h

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

@interface B : A {

}
+(A*)p;
-(void)display;
@end

B.m

#import "B.h"


@implementation B
+(A*)p
{
    NSLog(@"returning derived class object to the base class!!");
    return [B new];
}
-(void)display
{
    NSLog(@"Hello");
}


@end

Ответы [ 2 ]

2 голосов
/ 21 мая 2011

p - это метод класса.В Obj-C вы обозначаете метод класса, используя + в объявлении метода и - для обозначения экземпляра метода.Вы можете вызвать метод класса, используя это:

// [ClassName methodName];
[B p];

Или вы можете изменить p на метод экземпляра следующим образом:

- (A *)p;
// and call
// [instanceName methodName];
[dep p];

Вы можете проверить Objective-C: Учебник для начинающих , чтобы начать с этим.

1 голос
/ 21 мая 2011

Существует также некоторая путаница в вашем управлении памятью, здесь:

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
B* der = [[B alloc]init]; 
[der p];
[pool drain];

Вы создаете и истощаете пулы автоматического выпуска, чтобы помещать в них вещи (после создания), а затем сразу же избавляться от них (по мере того, как вы сливаете их). Но вы ничего не положили в бассейн. Вы использовали «alloc» для создания «der», что означает, что вы «владеете» им в целях управления памятью, а не помещаете его в пул авто-выпусков, где об этом позаботятся автоматически.

Если все, что я сделал, это еще больше сбил вас с толку, то вам, вероятно, стоит ознакомиться с вводной книгой по Objective-C. Все они освещают эту тему в какой-то момент. Или вы можете посмотреть документы Apple по управлению памятью, но они предполагают, что вы уже знаете определенные вещи. (И это сбивает с толку, так что наберитесь терпения ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...