문제

(우리는 Codult UiviewController 서브 클래스 내부의 코드에 대해 이야기하고 있습니다. in- (void) viewDidLoad를 다음 서브 뷰에 추가하십시오. 컨트롤이 멤버가 아닌 경우, 내가 그것을 만들고 방법으로 로컬로 릴리스하면 이것이 내가하는 방법입니다 : (uilabel과 함께)

- (void)viewDidLoad {
    UILabel *localLabel = [[UILabel alloc] initWithFrame:CGRectMake(81, 384, 148, 21)];
    localLabel.text = @"I'm a Label!";
    localLabel.AutoresizingMask = (UIViewAutoresizingFlexibleLeftMargin |
                                  UIViewAutoresizingFlexibleRightMargin |
                                  UIViewAutoresizingFlexibleBottomMargin);

    [self.view addSubview:localLabel];
    [localLabel release];
    [super viewDidLoad];
}

이것은 로컬로 레이블을 만들고 속성을 설정하고 하위 뷰 및 릴리스에 추가하는 방법의 예입니다. 그러나 회원과 함께, 나는 이것을한다 :

UILabel *lblMessage;
...
@property (nonatomic, retain)UILabel *lblMessage;
...
- (void)viewDidLoad {
    UILabel *localMessage = [[UILabel alloc] initWithFrame:CGRectMake(81, 384, 148, 21)];
    localMessage.text = @"I'm a Label!";
    localMessage.AutoresizingMask = (UIViewAutoresizingFlexibleLeftMargin |
                                      UIViewAutoresizingFlexibleRightMargin |
                                      UIViewAutoresizingFlexibleBottomMargin);
    self.lblMessage = localMessage;
    [localMessage release];

    [self.view addSubview:lblMessage];
    [super viewDidLoad];
}

그러나 나는 또한 그것을 본 것을 보았다

...
- (void)viewDidLoad {
   UILabel *localMessage = [[UILabel alloc] initWithFrame:CGRectMake(81, 384, 148, 21)];
    localMessage.text = @"I'm a Label!";
    localMessage.AutoresizingMask = (UIViewAutoresizingFlexibleLeftMargin |
                                      UIViewAutoresizingFlexibleRightMargin |
                                      UIViewAutoresizingFlexibleBottomMargin);
    self.lblMessage = localMessage;

    [self.view addSubview:localMessage];
    [localMessage release];
    [super viewDidLoad];
}

저의 시작 iPhone 3 Development : SDK 책 탐색. 로컬 변수를 추가 한 다음 공개하십시오. 나는 무엇을해야합니까? 전혀 중요합니까?

도움이 되었습니까?

해결책

만약에 lblMessage 유지 속성 (종종 사실)이면 기능적 차이가 없습니다. 그렇지 않으면, 릴리스-adddsubview는 릴리스가 서브 뷰로 거래 된 객체를 추가하려고 시도하기 때문에 버그입니다.

다음은 참조 수의 빠른 연습입니다. localMessage, 재산을 가정합니다 lblMessage 유지 중입니다 :

UILabel *localMessage = [[UILabel alloc]...  // retainCount is now 1
// Set up localMessage.  If you release'd now, you'd dealloc the object.
self.lblMessage = localMessage;  // retainCount is now 2
// You can safely call release now if you'd like.
[self.view addSubview:localMessage];  // retainCount is now 3.
[localMessage release];  // retainCount is now 2.

당신은 원합니다 retainCount 2시에 끝나기 위해, 당신은 그 객체에 대한 2 개의 참조를 효과적으로 가지고 있기 때문에 - 당신의 멤버 포인터 lblMessage, 그리고 또 다른 유지 포인터 self.view.

다른 팁

멤버와 로컬 스코프 레이블 인 레이블은 서로 참조이므로 동일한 객체이므로 어떤 방식 으로든 중요하지 않으므로 로컬이없고 레이블을 직접 초기화합니다.

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