Iphone iOS-I';我不知道这里是如何处理记忆的?

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”表示“重新计

UIImage API参考文档:-
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;
}