IPhone SDK:返回没有分配的UILabel的正确方法

时间:2010-11-04 21:09:43

标签: iphone uilabel

我目前有一些代码如下:

-(UIView)someMethod {
  CGRectMake(0,0,100,100);
  UILabel *label = [[UILabel alloc] initWithFrame:rect];
  return label;
}

工作时,它显然会泄漏内存并需要修复。我认为修复将是:

UILabel *label = [UILabel initWithFrame:rect];

但是编译器告诉我UILabel没有响应initWithFrame。我想我的问题是双重的:

a)这样做的正确方法是什么,所以我不会泄漏记忆?

b)我很困惑为什么[UILabel alloc]会响应initWithFrame但不响应UILabel(我的理解是UILabel继承自UIView,它确实响应了initWithFrame)。

4 个答案:

答案 0 :(得分:4)

a)您无法避免+alloc。但您可以使用-autorelease放弃所有权。

-(UIView*)someMethod {
  CGRect rect = CGRectMake(0,0,100,100);
  UILabel *label = [[[UILabel alloc] initWithFrame:rect] autorelease];
  return label;
}

b) +alloc是一种类方法,-initWithFrame:是一种实例方法。后者只能在 上调用(或者,在ObjC术语中,发送到) UILabel的实例。但是,符号“UILabel”是一个类,而不是实例,因此[UILabel initWithFrame:rect]将不起作用。同样,只能在类上调用+alloc之类的类方法,因此[label alloc]将无效。

答案 1 :(得分:2)

也许更喜欢:

-(UILabel)someMethod {

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0,0,100,100)];
    return [label autorelease];
    }

答案 2 :(得分:1)

A)

 -(UIView *)someMethod {
    return [[[UILabel alloc] initWithFrame:CGRectMake(0,0,100,100)] autorelease];
}

b)你误解了类方法和实例方法之间的区别。

声明并使用类方法:

// declaration: notated with +
+ (NSDocumentController *)sharedDocumentController;
// usage
NSDocumentController * thang = [NSDocumentController sharedDocumentController];

声明并使用实例方法,如下所示:

// declaration: notated with -
- (id)init;
// usage:
// + alloc is a class method
//     this requests the class (NSObject) to allocate and return a newly allocated NSObject
// - init is the instance method
//     this sends a message to the NSObject instance (returned by [NSObject alloc])
NSObject * thang = [[NSObject alloc] init];

在您的示例中,alloc返回一个已分配的实例,然后您可以在其上调用适当的init实例方法。

某些类提供了方便构造函数,它们通常会返回一个自动释放的实例:

+ (NSNumber *)numberWithInt:(int)anInt;

但以这种方式复制代码并不常见,除非您正在使用类集群等高级主题。当然,如果您发现经常需要特定功能或便利构造函数,那么将它添加到界面可能是个好主意。

答案 3 :(得分:0)

只需使用原始方法并使用

return [label autorelease];

代替。