Iphone iOS-I';我不知道这里是如何处理记忆的?
UIImage API参考文档:-Iphone iOS-I';我不知道这里是如何处理记忆的?,iphone,objective-c,ios,ipad,ios4,Iphone,Objective C,Ios,Ipad,Ios4,UIImage API参考文档:- initWithContentsOfFile: 初始化并返回带有指定文件内容的图像对象 - (id)initWithContentsOfFile:(NSString *)path 参数 路径 文件的路径。此路径应包括标识图像数据类型的文件扩展名。 返回值 初始化的UIImage对象,或nil,如果该方法无法找到文件或从其内容初始化图像 考虑到这个场景,假设我有一个类,它可以是任何类的扩展。以UIImage为例 现在在这两种情况下 “alloc”表示“重新计
initWithContentsOfFile:
初始化并返回带有指定文件内容的图像对象
- (id)initWithContentsOfFile:(NSString *)path
参数路径
文件的路径。此路径应包括标识图像数据类型的文件扩展名。
返回值 初始化的UIImage对象,或nil,如果该方法无法找到文件或从其内容初始化图像
考虑到这个场景,假设我有一个类,它可以是任何类的扩展。以UIImage为例 现在在这两种情况下 “alloc”表示“重新计数+1”
如果 initWithDefaultImage/initWithContentsOfFile 由于某些问题返回了nil-比方说(无效的文件路径),此内存将泄漏为 myObject/yourObject 将设置为零,即使分配在init之前进行
我见过许多这样的扩展类/接口实现。我不知道这里是如何处理记忆的?有人能分享这方面的看法吗?你是对的,有时候人们会忘记处理这个漏洞。如果无法继续初始化,则需要释放分配的内存
-(id)initWithDefaultImage
{
NSString *path = [[NSBundle mainBundle] pathForResource:@"someInvalidImage" ofType:@"png"];
if (path != nil)
{
self = [super initWithContentsOfFile:path];
}
else // cannot proceed with init
{
[self release];
self = nil;
}
return self;
}
通常,相应的初始值设定项在返回
nil
之前释放self
(新对象),如:
- (id)initWithFoo
{
self = [super init];
if (!self) return nil;
if (someInitializingFailed) {
[self release];
return nil;
}
return self;
}
您可以假设-[UIImage initWithContentsOfFile:
正在实现相同的模式。所以,除非仪器确实告诉你有泄漏,否则你不需要在你的情况下做任何特殊处理
如果[super init]返回nil,则返回nil。因此,控件从方法返回,if(someInitializingFailed)块将永远不会执行,内存将泄漏,因为在调用“initWithFoo”之前已经执行了alloc
如果[super init]
返回nil
,则super的init
在其自身之后已被清除,并释放了alloc
分配的内存
发件人:
您应该仅在故障点对self调用release方法。如果通过调用超类的初始值设定项返回nil,则不应同时调用release
我建议遵守惯例,让你的课程以大写字母开始。你会让你的生活更轻松(如果你和其他人一起工作,你会避免被侮辱和殴打;-)亲爱的DarkDust。。我只是在讨论这个问题。请不要这么苛刻。。!我想DarkDust只是在开玩笑,仅此而已。DarkDust是正确的,但是,正如我通过艰苦的学习所了解到的,类应该大写,IVAR和方法应该以小写开头。如果[super init]返回nil,则返回nil。因此,控件从方法返回,if(someInitializingFailed)块将永远不会执行,内存将泄漏,因为在调用“initWithFoo”之前已经执行了alloc;使用->返回[super initWithContentsOfFile:path];那么它将是正确的?@samfisher如果
[super init]
返回nil
,super的init
在其自身之后已经被清除并释放了alloc
分配的内存。在中,“您应该只在出现故障时调用self上的release方法。如果您从调用超类的初始值设定项中得到nil,那么您不应该也调用release。”谢谢@albertamg这就是我想要的解释。你可以把它作为答案发布,这样我就可以接受它了吗?在你已经开始初始化之后,你怎么能用contentsoffile调用init呢?
- (id)initWithFoo
{
self = [super init];
if (!self) return nil;
if (someInitializingFailed) {
[self release];
return nil;
}
return self;
}