iPhone Dev- 회원을 하위 뷰로 추가 해야하는 방법
-
10-07-2019 - |
문제
(우리는 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
.
다른 팁
멤버와 로컬 스코프 레이블 인 레이블은 서로 참조이므로 동일한 객체이므로 어떤 방식 으로든 중요하지 않으므로 로컬이없고 레이블을 직접 초기화합니다.