Referência de classe Objective-C:Erro de símbolos não encontrados
-
12-11-2019 - |
Pergunta
Estou trabalhando neste aplicativo para iPhone há algum tempo e o finalizei completamente e funcionando.O projeto que eu estava expandindo foi baixado de um repositório online do Subversion ao qual meu professor também me deu acesso.Acidentalmente não baixei a cópia "root" ou algo parecido, então não consegui enviar nenhuma alteração no repositório.Com a ajuda dos meus instrutores, baixei a cópia raiz hoje e adicionei todos os meus arquivos de classe a ela para poder confirmar as alterações.No entanto, agora estou recebendo três erros estranhos que nunca vi antes:
Símbolos indefinidos:
"_Objc_class _ $ _ MapListViewController", mencionado em:Objc-class-ref-to-maplistViewController em mapViewController.o
"_Objc_class _ $ _ MAPPSER", referenciado de:objc-class-ref-to-mapParser em mapViewController.o
"_Objc_class _ $ _ MaptabViewController", mencionado em:Objc-class-ref-to-maptabViewController em mapViewController.o
ld:símbolo(s) não encontrado(s) collect2:LD retornou 1 status de saída
Essa é a mensagem de erro exata que estou recebendo.Não alterei nenhum código da versão que estava funcionando completamente esta manhã.Algum conselho?O arquivo mapViewController parece ser o que está causando o problema, então aqui está isso também:
#import "mapViewController.h"
#import "locationDetailViewController.h"
#import "DPUAnnotation.h"
#import "mapParser.h"
#import "mapListViewController.h"
#import "mapTabViewController.h"
@implementation mapViewController
@synthesize locationManager, mapView, mapAnnotations, mParser, mapListView, tabView;
@class DPUAnnotation;
+ (CGFloat)annotationPadding;
{
return 10.0f;
}
+ (CGFloat)calloutHeight;
{
return 40.0f;
}
- (void)gotoLocation
{
// start off by default at DePauw campus
MKCoordinateRegion newRegion;
newRegion.center.latitude = 39.639348;
newRegion.center.longitude = -86.861231;
newRegion.span.latitudeDelta = 0.006776;
newRegion.span.longitudeDelta = 0.006291;
[self.mapView setRegion:newRegion animated:YES];
}
- (void)viewDidLoad {
self.title = @"Map";
mapView.mapType = MKMapTypeHybrid;
mapView.showsUserLocation = YES;
mapListView = [[mapListViewController alloc] initWithNibName:@"mapListView" bundle:nil];
tabView = [[mapTabViewController alloc] initWithNibName:@"mapTabViewController" bundle:nil];
if (mapAnnotations == nil)
{
self.mapAnnotations = [NSMutableArray array];
}
else
{
[mapAnnotations removeAllObjects];
}
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"btn_home.png"] style:UIBarButtonItemStyleBordered target:self action:@selector(mainpageClicked)];
[self.navigationItem setLeftBarButtonItem:backButton];
UIBarButtonItem *mapListButton = [[UIBarButtonItem alloc] initWithTitle:@"Building List" style:UIBarButtonItemStylePlain target:self action:@selector(pushMapList)];
[self.navigationItem setRightBarButtonItem: mapListButton];
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
[locationManager startUpdatingLocation];
[self gotoLocation];
self.mParser = [[[mapParser alloc] init] autorelease];
self.mParser.delegate = self;
[self.mParser start];
[super viewDidLoad];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:(BOOL)animated];
}
- (void)dealloc
{
[mapView release];
[locationManager release];
[mapAnnotations release];
[super dealloc];
}
/*
* Returns the User to the main Application Page
*/
- (IBAction)mainpageClicked
{
NSLog(@"Return To Main page Clicked");
[self.parentViewController dismissModalViewControllerAnimated:YES];
[self.navigationController release];
}
- (IBAction) pushMapList
{
tabView = [[mapTabViewController alloc] initWithNibName:@"mapTabViewController" bundle:nil];
tabView.mapAnnotations2 = mapAnnotations;
[self.navigationController pushViewController:tabView animated:YES];
[tabView release];
}
- (IBAction)addAnnotation
{
[self.mapView removeAnnotations:self.mapView.annotations];
for (int i = 0; i < [mapAnnotations count]; i++)
[mapView addAnnotation:[mapAnnotations objectAtIndex:i]];
NSLog(@"BLAH BLAH BLAH PLEASE PRINT");
if([mapAnnotations count] == 0)
NSLog(@"array is empty");
}
- (void)showDetails:(id)sender
{
NSInteger selectedIndex = [sender tag];
DPUAnnotation *selectedObject = [mapAnnotations objectAtIndex:selectedIndex];
[self.navigationController setToolbarHidden:YES animated:NO];
NSURL *url = [NSURL URLWithString: selectedObject.url];
locationDetailViewController *locationDetailView;
locationDetailView = [[locationDetailViewController alloc] initWithNibName:@"mapDetailView" bundle:nil];
[self.navigationController pushViewController:locationDetailView animated:YES];
[locationDetailView.webView loadRequest: [NSURLRequest requestWithURL:url]];
[locationDetailView release];
[selectedObject release];
}
- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation
{
// if it's the user location, just return nil.
if ([annotation isKindOfClass:[MKUserLocation class]])
return nil;
if([[annotation subtitle] isEqualToString:@"Academic"])
{
// try to dequeue an existing pin view first
static NSString* annotationIdentifier = @"annotationIdentifier";
MKPinAnnotationView* pinView = (MKPinAnnotationView *)[theMapView dequeueReusableAnnotationViewWithIdentifier:annotationIdentifier];
if (!pinView)
{
MKAnnotationView *annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation
reuseIdentifier:annotationIdentifier] autorelease];
annotationView.canShowCallout = YES;
UIImage *academicImage = [UIImage imageNamed:@"academic.png"];
CGRect resizeRect;
resizeRect.size = academicImage.size;
CGSize maxSize = CGRectInset(self.view.bounds,
[mapViewController annotationPadding],
[mapViewController annotationPadding]).size;
maxSize.height -= self.navigationController.navigationBar.frame.size.height + [mapViewController calloutHeight];
if (resizeRect.size.width > maxSize.width)
resizeRect.size = CGSizeMake(maxSize.width, resizeRect.size.height / resizeRect.size.width * maxSize.width);
if (resizeRect.size.height > maxSize.height)
resizeRect.size = CGSizeMake(resizeRect.size.width / resizeRect.size.height * maxSize.height, maxSize.height);
resizeRect.origin = (CGPoint){0.0f, 0.0f};
UIGraphicsBeginImageContext(resizeRect.size);
[academicImage drawInRect:resizeRect];
UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
annotationView.image = resizedImage;
annotationView.opaque = NO;
UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
NSInteger annotationValue = [self.mapAnnotations indexOfObject:annotation];
rightButton.tag = annotationValue;
[rightButton addTarget:self action:@selector(showDetails:) forControlEvents:UIControlEventTouchUpInside];
annotationView.rightCalloutAccessoryView = rightButton;
return annotationView;
}
else
{
pinView.annotation = annotation;
}
return pinView;
}
else if([[annotation subtitle] isEqualToString:@"Administrative"])
{
// try to dequeue an existing pin view first
static NSString* annotationIdentifier = @"annotationIdentifier";
MKPinAnnotationView* pinView = (MKPinAnnotationView *)[theMapView dequeueReusableAnnotationViewWithIdentifier:annotationIdentifier];
if (!pinView)
{
MKAnnotationView *annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation
reuseIdentifier:annotationIdentifier] autorelease];
annotationView.canShowCallout = YES;
UIImage *administrativeImage = [UIImage imageNamed:@"administrative.png"];
CGRect resizeRect;
resizeRect.size = administrativeImage.size;
CGSize maxSize = CGRectInset(self.view.bounds,
[mapViewController annotationPadding],
[mapViewController annotationPadding]).size;
maxSize.height -= self.navigationController.navigationBar.frame.size.height + [mapViewController calloutHeight];
if (resizeRect.size.width > maxSize.width)
resizeRect.size = CGSizeMake(maxSize.width, resizeRect.size.height / resizeRect.size.width * maxSize.width);
if (resizeRect.size.height > maxSize.height)
resizeRect.size = CGSizeMake(resizeRect.size.width / resizeRect.size.height * maxSize.height, maxSize.height);
resizeRect.origin = (CGPoint){0.0f, 0.0f};
UIGraphicsBeginImageContext(resizeRect.size);
[administrativeImage drawInRect:resizeRect];
UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
annotationView.image = resizedImage;
annotationView.opaque = NO;
UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
NSInteger annotationValue = [self.mapAnnotations indexOfObject:annotation];
rightButton.tag = annotationValue;
[rightButton addTarget:self action:@selector(showDetails:) forControlEvents:UIControlEventTouchUpInside];
annotationView.rightCalloutAccessoryView = rightButton;
return annotationView;
}
else
{
pinView.annotation = annotation;
}
return pinView;
}
else if([[annotation subtitle] isEqualToString:@"University Housing"] || [[annotation subtitle] isEqualToString:@"Residence Halls"] || [[annotation subtitle] isEqualToString:@"University Duplexes"] || [[annotation subtitle] isEqualToString:@"Greek Housing"])
{
// try to dequeue an existing pin view first
static NSString* annotationIdentifier = @"annotationIdentifier";
MKPinAnnotationView* pinView = (MKPinAnnotationView *)[theMapView dequeueReusableAnnotationViewWithIdentifier:annotationIdentifier];
if (!pinView)
{
MKAnnotationView *annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation
reuseIdentifier:annotationIdentifier] autorelease];
annotationView.canShowCallout = YES;
UIImage *housingImage = [UIImage imageNamed:@"housing.png"];
CGRect resizeRect;
resizeRect.size = housingImage.size;
CGSize maxSize = CGRectInset(self.view.bounds,
[mapViewController annotationPadding],
[mapViewController annotationPadding]).size;
maxSize.height -= self.navigationController.navigationBar.frame.size.height + [mapViewController calloutHeight];
if (resizeRect.size.width > maxSize.width)
resizeRect.size = CGSizeMake(maxSize.width, resizeRect.size.height / resizeRect.size.width * maxSize.width);
if (resizeRect.size.height > maxSize.height)
resizeRect.size = CGSizeMake(resizeRect.size.width / resizeRect.size.height * maxSize.height, maxSize.height);
resizeRect.origin = (CGPoint){0.0f, 0.0f};
UIGraphicsBeginImageContext(resizeRect.size);
[housingImage drawInRect:resizeRect];
UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
annotationView.image = resizedImage;
annotationView.opaque = NO;
UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
NSInteger annotationValue = [self.mapAnnotations indexOfObject:annotation];
rightButton.tag = annotationValue;
[rightButton addTarget:self action:@selector(showDetails:) forControlEvents:UIControlEventTouchUpInside];
annotationView.rightCalloutAccessoryView = rightButton;
return annotationView;
}
else
{
pinView.annotation = annotation;
}
return pinView;
}
else if([[annotation subtitle] isEqualToString:@"Other"])
{
// try to dequeue an existing pin view first
static NSString* annotationIdentifier = @"annotationIdentifier";
MKPinAnnotationView* pinView = (MKPinAnnotationView *)[theMapView dequeueReusableAnnotationViewWithIdentifier:annotationIdentifier];
if (!pinView)
{
MKAnnotationView *annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation
reuseIdentifier:annotationIdentifier] autorelease];
annotationView.canShowCallout = YES;
UIImage *otherImage = [UIImage imageNamed:@"other.png"];
CGRect resizeRect;
resizeRect.size = otherImage.size;
CGSize maxSize = CGRectInset(self.view.bounds,
[mapViewController annotationPadding],
[mapViewController annotationPadding]).size;
maxSize.height -= self.navigationController.navigationBar.frame.size.height + [mapViewController calloutHeight];
if (resizeRect.size.width > maxSize.width)
resizeRect.size = CGSizeMake(maxSize.width, resizeRect.size.height / resizeRect.size.width * maxSize.width);
if (resizeRect.size.height > maxSize.height)
resizeRect.size = CGSizeMake(resizeRect.size.width / resizeRect.size.height * maxSize.height, maxSize.height);
resizeRect.origin = (CGPoint){0.0f, 0.0f};
UIGraphicsBeginImageContext(resizeRect.size);
[otherImage drawInRect:resizeRect];
UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
annotationView.image = resizedImage;
annotationView.opaque = NO;
UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
NSInteger annotationValue = [self.mapAnnotations indexOfObject:annotation];
rightButton.tag = annotationValue;
[rightButton addTarget:self action:@selector(showDetails:) forControlEvents:UIControlEventTouchUpInside];
annotationView.rightCalloutAccessoryView = rightButton;
return annotationView;
}
else
{
pinView.annotation = annotation;
}
return pinView;
}
else if([[annotation subtitle] isEqualToString:@"Fields"])
{
// try to dequeue an existing pin view first
static NSString* annotationIdentifier = @"annotationIdentifier";
MKPinAnnotationView* pinView = (MKPinAnnotationView *)[theMapView dequeueReusableAnnotationViewWithIdentifier:annotationIdentifier];
if (!pinView)
{
MKAnnotationView *annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation
reuseIdentifier:annotationIdentifier] autorelease];
annotationView.canShowCallout = YES;
UIImage *athleticsImage = [UIImage imageNamed:@"athletics.png"];
CGRect resizeRect;
resizeRect.size = athleticsImage.size;
CGSize maxSize = CGRectInset(self.view.bounds,
[mapViewController annotationPadding],
[mapViewController annotationPadding]).size;
maxSize.height -= self.navigationController.navigationBar.frame.size.height + [mapViewController calloutHeight];
if (resizeRect.size.width > maxSize.width)
resizeRect.size = CGSizeMake(maxSize.width, resizeRect.size.height / resizeRect.size.width * maxSize.width);
if (resizeRect.size.height > maxSize.height)
resizeRect.size = CGSizeMake(resizeRect.size.width / resizeRect.size.height * maxSize.height, maxSize.height);
resizeRect.origin = (CGPoint){0.0f, 0.0f};
UIGraphicsBeginImageContext(resizeRect.size);
[athleticsImage drawInRect:resizeRect];
UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
annotationView.image = resizedImage;
annotationView.opaque = NO;
UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
NSInteger annotationValue = [self.mapAnnotations indexOfObject:annotation];
rightButton.tag = annotationValue;
[rightButton addTarget:self action:@selector(showDetails:) forControlEvents:UIControlEventTouchUpInside];
annotationView.rightCalloutAccessoryView = rightButton;
return annotationView;
}
else
{
pinView.annotation = annotation;
}
return pinView;
}
else if([[annotation subtitle] isEqualToString:@"Landmarks"])
{
// try to dequeue an existing pin view first
static NSString* annotationIdentifier = @"annotationIdentifier";
MKPinAnnotationView* pinView = (MKPinAnnotationView *)[theMapView dequeueReusableAnnotationViewWithIdentifier:annotationIdentifier];
if (!pinView)
{
MKAnnotationView *annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation
reuseIdentifier:annotationIdentifier] autorelease];
annotationView.canShowCallout = YES;
UIImage *landmarkImage = [UIImage imageNamed:@"landmark.png"];
CGRect resizeRect;
resizeRect.size = landmarkImage.size;
CGSize maxSize = CGRectInset(self.view.bounds,
[mapViewController annotationPadding],
[mapViewController annotationPadding]).size;
maxSize.height -= self.navigationController.navigationBar.frame.size.height + [mapViewController calloutHeight];
if (resizeRect.size.width > maxSize.width)
resizeRect.size = CGSizeMake(maxSize.width, resizeRect.size.height / resizeRect.size.width * maxSize.width);
if (resizeRect.size.height > maxSize.height)
resizeRect.size = CGSizeMake(resizeRect.size.width / resizeRect.size.height * maxSize.height, maxSize.height);
resizeRect.origin = (CGPoint){0.0f, 0.0f};
UIGraphicsBeginImageContext(resizeRect.size);
[landmarkImage drawInRect:resizeRect];
UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
annotationView.image = resizedImage;
annotationView.opaque = NO;
UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
NSInteger annotationValue = [self.mapAnnotations indexOfObject:annotation];
rightButton.tag = annotationValue;
[rightButton addTarget:self action:@selector(showDetails:) forControlEvents:UIControlEventTouchUpInside];
annotationView.rightCalloutAccessoryView = rightButton;
return annotationView;
}
else
{
pinView.annotation = annotation;
}
return pinView;
}
return nil;
}
#pragma mark <mapParser> Implementation
- (void)parser:(NSXMLParser *)parser didFailWithError:(NSError *)parseError {
}
- (void)parserDidEndParsingData:(mapParser *)parser
{
[self addAnnotation];
tabView.mapAnnotations2 = mapAnnotations;
self.mParser = nil;
[mParser release];
}
- (void)parser:(mapParser *)parser didParseItem:(NSArray *)parsedItem
{
NSLog(@"Did Parse Map Item");
[self.mapAnnotations addObjectsFromArray:parsedItem];
}
- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error {}
- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark {}
@end
Solução
Muito provavelmente essas três classes estão faltando no arquivo do seu projeto.Verifique o grupo Classes em seu projeto XCode para ver se esses três arquivos estão presentes.Caso contrário, clique com o botão direito no grupo Classes e clique em Adicionar > Arquivos Existentes para adicioná-los.
Se os arquivos forem adicionados ao projeto, certifique-se de que os arquivos de implementação (.m) dessas classes ausentes sejam adicionados às fontes compiladas.Para verificar isso, expanda o grupo Targets > your application target > Compile Sources
, e veja se os arquivos estão presentes.Caso contrário, clique com o botão direito em "Compile Sources" e vá para Add > Existing Files
para adicioná-los.Uma maneira alternativa e talvez mais rápida de fazer o mesmo é selecionar os arquivos .m para cada uma das classes ausentes e ver se a caixa de seleção na extrema direita está marcada.Caso contrário, verifique-o e ele será adicionado automaticamente às fontes compiladas.
Outras dicas
"_OBJC_CLASS_$_mapListViewController", referenciado em:objc-class-ref-to-mapListViewController em mapViewController.o
"_OBJC_CLASS_$_mapParser", referenciado em:objc-class-ref-to-mapParser em mapViewController.o
"_OBJC_CLASS_$_mapTabViewController", referenciado em:objc-class-ref-to-mapTabViewController em mapViewController.o
ld:símbolo(s) não encontrado(s) collect2:ld retornou 1 status de saída
Certifique-se de que todos (mapListViewController,mapParser,mapTabViewController) tenham @interface e @implementation
isso resolve meu problema.acontece que sinto falta, veja @implementation estava faltando
Eu estava tendo o mesmo problema que resolvi adicionando o Framework ao xCode
quando você adiciona CoreGraphics libraray.você precisa selecionar project_name->targets/selecionar nome do projeto (não selecionar o nome de teste do projeto, é um erro que você enfrenta)->buildsetting->e adicionar CoreLocation.framework
Eu estava tendo esse problema quando estava tentando ter pod 'FirebaseRemoteConfig
dentro de extensões de aplicativos.Eu adicionei $(inherited)
em vez de -ObjC
para Outros sinalizadores de vinculador nas configurações de compilação do destino da extensão.
Espero que ajude alguém aí.Perdi 1 hora encontrando esta solução.