문제

AppDelegate에서는 정적 라이브러리에 정의 된 인스턴스를 할당하고 있습니다. 이 인스턴스에는 nsstring 속성이 "사본"을 설정합니다. 이 인스턴스에서 문자열 속성에 액세스하면 앱은 '인식되지 않은 선택기가 인스턴스로 전송 된'과 충돌합니다. Xcode는 속성에 대한 코드 힌트를 제공하므로 호출 앱에 알려져 있습니다. 특정 클래스는 정적 라이브러리 대상으로 컴파일됩니다. 내가 무엇을 놓치고 있습니까?

코드 추가.

//static library 
//ClassA.h
@interface ClassA : NSObject {
...
NSString *downloadUrl;
}
@property(nonatomic, copy) NSString *downloadUrl;

//ClassA.m
@synthesize downloadUrl;

호출 앱의 AppDelegate에서.

//app delegate header file
@interface myApp : NSObject <UIApplicationDelegate> {
ClassA *classA;
}
@property (nonatomic, retain) ClassA *classA;

//app delegate .m file
@synthesize classA;

- (void)applicationDidFinishLaunching:(UIApplication *)application {
classA = [[ClassA alloc] init];
//exception occurs here.  downloadUrl is of type NSCFNumber
classA.downloadUrl = @"http://www.abc.com/";
...}

앱의 다른 클래스는 대의원을 참조하고 classa.downloadurl을 호출합니다.

도움이 되었습니까?

해결책

1) 내부의 합성입니다 @implementation 차단하다?

2) 참조해야합니다 self.classA = [[ClassA alloc] init]; 그리고 self.classA.downloadUrl = @"..." 평범한 대신 classA?

3) 당신의 myApp.m 가져와야하는 파일 ClassA.h, 누락되면 숫자 또는 포인터로 기본값이 있습니까? (c compiler에서 찾을 수없는 경우 c 변수에서 int로 기본값) :

#import "ClassA.h".

다른 팁

깃발을 설정하십시오 -OBJC 프로젝트 설정의 다른 링커 플래그에서 ... (정적 라이브러리 프로젝트가 아니라 정적 라이브러리를 사용하는 프로젝트 ...) 프로젝트 설정에서 구성이 설정되어 있는지 확인하십시오. 모든 구성

많은 사람들 이이 문제와 비슷한 질문에 대해 매우 기술적 인 답변을했지만 그보다 더 간단하다고 생각합니다. 때로는주의를 기울이지 않는 경우 사용하지 않는 선택기가 인터페이스에 무언가에 첨부 될 수 있습니다. 선택기가 거기에 있지만 코드를 작성하지 않았기 때문에이 오류가 발생할 수 있습니다.

그렇지 않다는 점을 다시 확인하는 가장 쉬운 방법은 항목을 제어 클릭하여 해당 항목과 관련된 모든 선택기를 볼 수있는 것입니다. 거기에 당신이되고 싶지 않은 것이 있다면, 그것을 없애십시오! 도움이 되었기를 바랍니다...

당신이 게시 한 코드에서 당신은 setDownloadURL: 세터로 ClassA - 즉, 수업 자체. 인스턴스의 속성을 설정하려고합니다.

Classa를 AppDelegate 클래스로 어떻게 가져오고 있습니까? 메인 프로젝트에 .h 파일을 포함 했습니까? 헤더 파일을 메인 프로젝트에 복사하지 않았기 때문에이 문제가 발생했습니다.

복사하거나 .h를 만들면 나를 위해 해결했습니다.

나 에게이 오류의 원인은 실수로 같은 메시지가 같은 클래스 멤버에게 두 번 전송된다는 것입니다. GUI의 버튼을 마우스 오른쪽 버튼으로 클릭하면 메소드 이름을 두 번 볼 수 있었고 방금 삭제했습니다. 제 경우에는 실수가 있었지만 다른 초보자가 고려해야 할 것을 원했습니다.

내 것은 단순/바보였습니다. 초보자 실수, NSmanagedObject를 일반적인 nsobject로 변환 한 사람.

나는 :

@dynamic order_id;

내가 가져야 할 때 :

@synthesize order_id;

이것이 반드시 최고의 디자인 패턴은 아닙니다. 그것의 외관에서, 당신은 본질적으로 앱 대의원을 사용하여 글로벌 변수에 금액을 저장하는 것입니다.

Matt Gallagher http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html. 아마도 당신의 classa는 AppDelegate의 글로벌보다는 싱글 톤이어야하지만, 당신은 단순히 싱글 톤이 아니라 더 일반적인 목적이 될 가능성이 있지만 가능합니다. 이 경우 클래스 A의 사전 구성된 인스턴스를 반환하는 클래스 메소드를 사용하면 다음과 같은 것입니다.

+ (ClassA*) applicationClassA
{
    static ClassA* appClassA = nil;
    if ( !appClassA ) {
        appClassA = [[ClassA alloc] init];
        appClassA.downloadURL = @"http://www.abc.com/";
    }
    return appClassA;
}

또는 또는 (범용 클래스에 응용 프로그램 별 항목을 추가하므로), 해당 클래스 방법을 포함하는 유일한 목적을 가진 새로운 클래스를 만듭니다.

요점은 Application Globals가 AppDelegate의 일부일 필요는 없다는 것입니다. AppDelegate가 알려진 싱글 톤이기 때문에 NSapplication Delegate Methods를 처리하는 것과 개념적으로 관련이 없더라도 다른 모든 App Global이 혼합되어야한다는 의미는 아닙니다.

아주 이상하지만. 응용 프로그램 인스턴스의 클래스를 myApplication : myApplication : nsObject 대신 uiapplication으로 선언해야합니다. UIAPPLICATIONDELEGATE 프로토콜은 +RegisterForsyStemevents 메시지를 구현하지 않는 것 같습니다. 미친 사과 아피스.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top