(我们在讨论自定义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个对该对象的引用 - 您的成员指针<=>,以及<=>中的另一个保留指针。

其他提示

作为成员的标签和本地范围标签是彼此的引用,因此它们是同一个对象,因此无论你采用哪种方式都没关系,我只是没有本地并直接初始化标签

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top