Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 类方法中的IOS内存泄漏_Iphone_Objective C_Ios - Fatal编程技术网

Iphone 类方法中的IOS内存泄漏

Iphone 类方法中的IOS内存泄漏,iphone,objective-c,ios,Iphone,Objective C,Ios,在您看来,如果我有一个NSObject的单例子类被初始化,参数如下: - (MyObject *) initWithSomeParam:(NSString *)param{ self = [super init]; if (SharedInstance == nil){ SharedInstance = [super init]; SharedInstance.someProperty = param; } return self;

在您看来,如果我有一个NSObject的单例子类被初始化,参数如下:

- (MyObject *) initWithSomeParam:(NSString *)param{
    self = [super init];
    if (SharedInstance == nil){
        SharedInstance = [super init];
        SharedInstance.someProperty = param;
    }
    return self;
}

+ (MyObject *) objectWithSomeParam:(NSString *)param{
    return [[self alloc] initWithSomeParam:param];
    // Will the alloc cause a leak?
}

用户无权访问实例方法,只能访问类。谢谢。

这不是实现单例的正常方式,您正在打破
init
的惯例。最好创建一个
sharedInstance
类方法,并将
initWithParam
方法保留为更常规的方法:

static MyObject *_sharedInstance = nil;

+ (MyObject *)sharedInstance:(NSString *)param
{
    if (_sharedInstance == nil)
    {
        _sharedInstance = [MyObject alloc] initWithParam:param];
    }
    return _sharedInstance;
}

// This must be called during app termination to avoid memory leak
+ (void)cleanup
{
    [_sharedInstance release];
    _sharedInstance = nil;
}

- (id)initWithParam:(NSString *)param
{
    self = [super init];
    if (self != nil)
    {
        self.someProperty = param;
    }
    return self;
}
然而,即使这样似乎也不太舒服;i、 e.如果用户使用不同的参数调用
sharedInstance
,会发生什么情况?也许您想保留初始化对象的
NSMutableDictionary
,并根据参数创建/返回它们

如果是这样,你会:

static NSMutableDictionary _sharedInstances = [[NSMutableDictionary alloc] init];

+ (MyObject *)sharedInstance:(NSString *)param
{
    MyObject *obj = [_sharedInstances objectForKey:param];
    if (obj == nil)
    {
        obj = [[MyObject alloc] initWithParam:param];
        [_sharedInstances setObject:obj forKey:param];
    }
    return obj;
}

// This must be called during app termination to avoid memory leak
+ (void)cleanup
{
    [_sharedInstances release];
    _sharedInstances = nil;
}

这里很好地描述了创建单例:或者这里:您不需要
cleanup
方法。在应用程序终止时,分配给应用程序的所有内存都会被释放。@jrturton Instruments会发出呜呜声,不是吗?不确定,因为它是静态的。无论如何,我会因为不必要的代码而受到仪器的抱怨。@jrturton我想这取决于你对泄漏的态度;编译器或其他工具链警告意味着您必须检查它们是否符合您的预期,这会为您的工作流程增加时间……如果是静态的,仪器和泄漏不会抱怨。静态是一个全局(有时是一个范围有限的全局),因此,总是可以访问、有效,并且永远不会是真正的泄漏。