我目前有一些代码如下:
-(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)。
答案 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];
代替。