2012-12-21 2 views
0

프로토콜을 구현하는 CLLocationManager 싱글 톤이 있으므로 다른 모델 클래스 (ServerConnection)에 사용자의 업데이트 된 위치를 찾았 음을 알릴 수 있습니다. 방법 내 AppDelegate에에서iOS - Model 클래스를 다른 Model 클래스의 위임으로 설정하십시오.

는 didFinishLaunching, 나는

ServerConnection* serverConnection = [[ServerConnection alloc] init]; 
[LocationManager sharedLocationSingleton].delegate = serverConnection; 
[[LocationManager sharedLocationSingleton] getUsersLocation]; 

이 작동하지 않습니다를 작성하고 내 ServerConnection 클래스의 대리자 메서드는 호출되지 않습니다. 그러나 다음 줄에 나와있는 것처럼 AppDelegate 클래스를 수신기로 사용하려고하면 잘 동작합니다.

다음
// self refers to AppDelegate 
[LocationManager sharedLocationSingleton].delegate = self; 

, 내 AppDelegate에 필요한 대리자 메서드를 구현하고 사용자의 위치가 업데이트 될 때 예상대로 메서드가 호출된다.

왜 위의 메서드가 실패하고 대리자를 serverConnection로 설정하려고합니까?

온라인 튜토리얼은 일반적으로 UIViewController 또는 AppDelegate를 "청취자"로 사용하지만 내 경우에는 별도의 모델 클래스를 청취자로 지정합니다. 어떻게해야합니까?

다음은 프로토콜 서버 연결에 대한 나의 헤더 파일이

@class LocationManager; 

@protocol LocationManagerDelegate <NSObject> 
@required 
-(void)LocationManagerUpdated:(LocationManager*) locationManager 
        withValue:(CLLocation*) location; 
@end 

@interface LocationManager : NSObject <CLLocationManagerDelegate> 

@property (strong, nonatomic) CLLocationManager* locationManager; 
@property (strong, nonatomic) CLLocation* location; 
@property (weak, nonatomic) id <LocationManagerDelegate> delegate; 

+(LocationManager*)sharedLocationSingleton; 
-(void) getUsersLocation; 

@end 

내을 locationManager 싱글 톤 클래스입니다. AppDelegate에 리스너로 설정 될 때 작동

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

@interface ServerConnection : NSObject <LocationManagerDelegate> 
@end 

,하지만 내 모델 객체 ServerConnection. 이 문제를 어떻게 해결할 수 있습니까?

감사합니다.

+0

'ServerConnection' 인터페이스 정의가 무엇 LocationManagerUpdated:withValue:를 호출하려고? – sergio

+0

수정 된 게시물, 감사합니다. –

답변

0

수행하려는 작업을 수행하는 데 문제가 없어야합니다 (예 : 컨트롤러가 아닌 클래스 인스턴스를 대리인으로 사용).

이 기능은 AppDelegate가 리스너이지만 내 모델 개체 인 ServerConnection이 아닌 경우에 작동합니다.

ServerConnection 클래스는 LocationManagerDelegate 프로토콜을 구현합니까? (나는 그 인터페이스에서 그것을 선언하는 것과 반대로 구현한다는 것을 의미한다).

는 대리자 메서드 ( LocationManagerUpdated:)를 호출하기위한 담당 LocationManager 방법을 확인하고 시도하고 그것에게 메시지를 보낼 때 대리자 개체가 올바르게 설정되어 있는지 확인하기 위해 거기 NSLog 추적을 추가 할 수 있습니다.

편집 : 당신이 언급 한 후

ServerConnection* serverConnection = [[ServerConnection alloc] init]; 
[LocationManager sharedLocationSingleton].delegate = serverConnection; 
[[LocationManager sharedLocationSingleton] getUsersLocation]; 

, 문제가 속성에 스택 변수에 serverConnection를 인스턴스화하지에서 비롯된 것이 분명하다.

delegate 속성을 강력한 속성으로 만드는 방법이 it leads to retain cycles부터 올바르지 않습니다. 당신이해야 할 일은 위에 붙여 넣은 코드 (앱 델리게이트?)를 실행하는 클래스에서 strongserverConnection 속성을 정의하는 것입니다.

내 발진이 들지 않는다면 위임자를 강력한 속성으로 정의하면 처음에 숨기는 두 번째 버그를 추가하여 버그를 수정하는 것입니다.

+0

감사! 위임자의 속성 선언을 weak에서 strong로 변경하여이 문제를 해결했습니다. –

+0

대리인을 강력한 속성으로 설정하는 것은 주기적 종속성을 초래할 수 있으므로 재난을 대비하는 방법입니다. http : //stackoverflow.com/questions/8449040/why-use -weak-delegate-for-delegation – sergio

+0

수정 된 답변을 보내 주셔서 감사합니다. 많은 의미가 있습니다. –

-1

serverConnection은 아무 것도 유지되지 않으며 delegate 속성은 weak으로 지정되어 있기 때문에 해제되고 nil로 설정됩니다.

확인 getUsersLocation 방법 및 대리인이 순간 전무 있는지 당신은

+0

감사! 약한 대신 위임 속성을 강하게 만들어서 수정했습니다. –

+0

위임 속성을 강하게 만들면 안됩니다. 나는 다른 해결책을 생각하는 것이 좋습니다. 문제는 어디서나'serverConnection'을 유지하지 않는 것입니다. 어쩌면 당신은이 'delegate' 속성을 필요로하지 않고'serverManager'를'LocationManager'의 private 속성으로 만 만들 수 있습니다. – Mindaugas

관련 문제