2011-07-28 6 views
0

내 프로그램에서 init 메소드의 속성에 값을 할당하려고합니다. 나중에 이벤트에 대한 응답으로이 속성을 사용합니다.합성 mutator와 대입 사용

Object라는 속성이 주어졌습니다. 이 합성 된 setter [self setObject:obj]을 작동하지만 Object = obj이 잘못된 선택기 예외를 제공하는 이유는 무엇입니까? 뮤 테이터가 obj의 참조 카운트에 1을 더하기 때문인가요?

편집 : 여기에 더 많은 코드가 있습니다. 위의 "작업"을 말하면 오류없이 실행된다는 의미입니다.

이 주 : 모든 속성이 (nonatomic, retain)로 선언 된 다음

은의 속성이 객체 (A보기 컨트롤러)의 초기화이다.

@synthesize _Kiosk; 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // Override point for customization after application launch. 
    [[UIApplication sharedApplication] setStatusBarHidden:true withAnimation:UIStatusBarAnimationFade]; 

    _Kiosk = [[Kiosk alloc] init]; 
    self.window.rootViewController = [_KioskViewController initWithNibName:@"iPadKioskView" bundle:nil andKiosk: _Kiosk]; 

    [_Kiosk release]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 
+0

여기서 무슨 일이 일어나고 있는지 명확하지 않습니다. 몇 가지 코드를 게시 할 수 있습니까? ivars, 속성 선언, 클래스의 초기화 및 Object 속성에 액세스하는 코드가 표시됩니까? –

+0

FWIW, "직장"이란 무엇입니까? 잘못된 셀렉터는 무엇입니까? –

+0

시간 내 주셔서 감사합니다! 더 많은 컨텍스트를 추가했습니다. 그리고 내가 일을 할 때, 나는 오류없이 실행된다는 것을 의미한다. (무효 셀렉터 에러를 얻지는 않는다.) –

답변

1

@property은 기본적으로 두 가지 방법, 즉 setFoo:foo을 선언합니다. @synthesize은 새 값을 올바르게 유지하고 이전 값을 해제하는 메서드 본문을 만듭니다.

그러나 인스턴스 변수에 직접 할당하면 해당 접근 자 메서드가 호출되지 않습니다. 포인터가 새로운 객체를 가리키게 만듭니다. 수동으로 인스턴스 변수를 설정하려면 새 값을 올바르게 유지하고 이전 값을 해제해야합니다.

foo = someFoo은 세터 메소드를 거치지 않고 인스턴스 변수를 직접 설정하는 반면 [self setFoo:someFoo]self.foo = someFoo은 모두 접근 자 메소드를 호출합니다.

+0

굉장! 설명 주셔서 감사합니다! –

0

당신은 확실히에서 [초기화 ..] 방법에 키오스크 매개 변수를 유지해야한다 : 여기

@synthesize _Kiosk; 

.... 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil andKiosk: (Kiosk*) kiosk 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     [self set_Kiosk:kiosk]; //This work witout error. _kiosk = kiosk Fails at point below. 
    } 
    return self; 
} 

.... 

- (IBAction) ActionPressed:(id)sender 
{ 
    [_CompanyName setText: [_Kiosk _CompanyName]]; //Failure happens here 
} 

그리고

이보기 컨트롤러를 초기화 메소드 호출이다. 그렇지 않으면이 파일이 해제되고 곧 또는 나중에 오류가 발생합니다.

한 가지 방법은 retain을 호출하여 직접 수행하는 것입니다. 또는 (비 원자형, 보유)으로 정의 된 경우 합성 된 setter를 사용할 수 있습니다.

+0

아마 내가 '_Kiosk' 속성을 가지고있는 곳을 포함해야한다. 헤더 파일에'@property (nonatomic, retain)'. –

+1

"자동 생성 된"setter를 호출하려면 다음과 같이 점 표기법을 사용하십시오. self._kiosk = kiosk –

1

게시 된 코드가 답을주었습니다. _ 키오스크를 이미 설정 했으므로 해제하지 마십시오. initWithNibName : _Kiosk에 할당 할 필요가 없습니다. 더 이상. dealloc 메서드에서 키오스크를 놓습니다. 키오스크를 변경하려면 class.Kiosk =을 사용하여 속성을 호출해야합니다.이 속성은 속성을 유지하고 이전 키오스크를 해제해야합니다.