2010-08-14 15 views
22

operator klasa:programowania iOS - Duplikat symbol _OBJC_IVAR

#import <Foundation/Foundation.h> 


@interface operator : NSObject { 

int number; 
} 

@property int number; 

@end 

@implementation operator 

- (id)init{ 
    self = [super init]; 
    if (self) { 
    [self setNumber:0]; 
    } 
    return self; 
} 

@synthesize number; 
@end 

main.m:

#import <UIKit/UIKit.h> 
#import "operator.m" 

int main(int argc, char *argv[]) { 

id operator1 = [[operator alloc] init]; 
id operator2 = [[operator alloc] init]; 

[operator1 setNumber:10]; 
[operator2 setNumber:20]; 

int answer = [operator1 number] + [operator2 number]; 

printf("The answer is %d",answer); 



NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
int retVal = UIApplicationMain(argc, argv, nil, nil); 
[pool release]; 
return retVal; 
} 

pojawia się błąd ->ld: duplicate symbol _OBJC_IVAR_$_operator.number in /Volumes/Home/Desktop/testing/build/testing.build/Debug-iphonesimulator/testing.build/Objects-normal/i386/operator.o and /Volumes/Home/Desktop/testing/build/testing.build/Debug-iphonesimulator/testing.build/Objects-normal/i386/main.o

To jest mój pierwszy raz, kiedy w programie ObjC. czy robię coś źle?

Próbowałem naprawić "Usuń wszystkie cele", które znalazłem w Google, ale nie pomogło.

+0

Taki sam problem może mieć również ten sam .m posiadanie dwóch różnych celów. Sprawdź moją odpowiedź na wypadek, gdyby ktoś podszedł do tego pytania szukając odpowiedzi. [Sprawdź moją odpowiedź, jeśli to jest przypadek.] (Http://stackoverflow.com/a/24394570/818506) –

Odpowiedz

91
  1. Nie należy nigdy #import pliku .m do innego pliku. Zaimportujesz plik .h, jeśli jest potrzebny.
  2. Nie powinieneś mieć kodu wykonującego w main przed utworzeniem puli autorelease. To prędzej czy później spowoduje problemy. W takim przypadku kod testowy powinien raczej zostać zmieniony na application:didFininshLaunching.
+0

@alexBrand: Łączycie się @ interfejs i @ implementacja dla operatora w tym samym pliku, a następnie importowanie całej rzeczy. Nie rób tego. Umieść je w operator.h i operator.m, a następnie #import only operator.h w main.m. –

+0

Zaimportowałem plik operator.h i działa :). Wielkie dzięki. Przesunąłem również pulę autorelease na początek kodu. Teraz, jak mam korzystać z aplikacji: didFinishLaunching? – AlexBrand

+3

Uratowałeś mnie, skasowałem i dodałem .m i zastanawiałem się, dlaczego to nie działa :) – Yanchi

1

Wyszukaj z pliku .m, który możesz importować w dowolnym pliku. Czasami trudno go znaleźć

+0

zbyt wiele powtórzeń tej samej odpowiedzi przy każdym pytaniu, tak jak to. Nie pomaga już to – NaXir

+0

Niestety to ci nie pomogło .. To był mój problem, kiedy znalazłem to pytanie, a następnie udostępniłem rozwiązanie .. i oczywiście już nie pomaga .. jest od roku 2011 .. – Yotes

0

Dla innych użytkowników, u których powyższe rozwiązania się nie sprawdziły, tak było z moim. Jestem leniwym programistą, więc zamiast przepisywania całego kodu dla nowej strony (UIView) będę często kopiował i wklejał poprzednie pliki U i .h oraz .hh ... W ten sposób czasami zapominam o zmianie nazwy interfejs wewnątrz plików .m i .h, które skopiowałem (nawet jeśli zmienię nazwy plików) ... To spowoduje również ten sam problem. Życzę wszystkim powodzenia!

3

biblioteka statyczna zaangażowany

dodałem klasę, która miała dokładnie taką samą nazwę jak klasa w bibliotece statycznych, że również używany. Dodanie przedrostka do nazwy mojej klasy rozwiązało problem.

+0

To zadziałało dla mnie – PassKit

+0

Dla mnie również działało – wiseindy

+0

Miałem ten sam plik.m do kodu źródłowego. Oba nie były duplikatami, ale po prostu tymi samymi nazwami, zmieniłem je i pracowałem tak, jak sugerował DanSkeel. – itzo