iPhone Dev - 将成员添加为子视图的方式
-
10-07-2019 - |
题
(我们在讨论自定义UIViewController子类中的代码 - 顺便说一下我不使用IB)好吧我把self.view成员设置在 - (void)loadView中,然后我创建我的控件和视图和中的任何内容 - (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开始时的那样:探索sdk书。注意添加局部变量,然后释放。我该怎么办?它有意义吗? 解决方案
如果lblMessage
是保留属性(通常为真),则没有功能差异。否则,release-before-addSubview是一个错误,因为它会尝试将解除分配的对象添加为子视图。
以下是localMessage
的引用计数的快速演练,假设属性retainCount
保留:
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.
您希望self.view
以2结束,因为您实际上有2个对该对象的引用 - 您的成员指针<=>,以及<=>中的另一个保留指针。
其他提示
作为成员的标签和本地范围标签是彼此的引用,因此它们是同一个对象,因此无论你采用哪种方式都没关系,我只是没有本地并直接初始化标签
不隶属于 StackOverflow