Методы класса и «Потенциальная утечка объекта, размещенного на линии ...» - PullRequest
2 голосов
/ 25 октября 2011

У меня такая ситуация:

- (void) foo {
    NSLog(@"Print this: %@", [MyObject classString]);
}

// So in MyObject.m I do
@implementation MyObject

+ (NSString *) classString {
     return [OtherObject otherClassString];   //The Warning "Potential leak..." is for this line
}
@end

// Finally in OtherObject
@implementation OtherObject

+ (NSString *) otherClassString {
    NSString *result = [[NSString alloc] initWithString:@"Hello World"];
    return result;
}
@end

Вначале у меня было предупреждение для otherClassString и для classString, но с таким способом для otherClassString эта работа.

Теперь моя проблема в classString в MyObject.Я много чего перепробовал, но это предупреждение всегда показывается.Разве я не могу вызвать метод класса внутри метода класса?

Ответы [ 3 ]

8 голосов
/ 25 октября 2011

Ваш +otherClassString создает объект с сохраненным счетчиком 1 и возвращает его.Это также используется как возвращаемое значение для +classString.

Если ваши методы не начинаются с init, new или copy, вы должны возвращать автоматически выпущенные объекты.Везде, где используются ваши (как есть), они должны будут возвращать автоматически выпущенный объект.

+ (NSString *) otherClassString {
    NSString *result = [[[NSString alloc]
                            initWithString:@"Hello World"]
                            autorelease];
    return result;
}
1 голос
/ 25 октября 2011

Ваша проблема сводится к следующему: у вас есть метод, который, согласно соглашениям об именах, должен возвращать объект с автоматическим освобождением, но вместо этого он возвращает сохраненный объект.Этот метод +otherClassString.Измените его на следующее:

+ (NSString *)otherClassString {
    NSString *result = [[NSString alloc] initWithString:@"Hello World"];
    return [result autorelease];
}
0 голосов
/ 25 октября 2011

Я точно воспроизвел ваш сценарий, и никаких ошибок или предупреждений не происходит. Возможно, у вас есть проблема с заголовочными файлами. Вот мой код (Xcode 4.2 и iOS5):

// myObject.h
#import <Foundation/Foundation.h>
#import "otherObject.h"

@interface myObject : NSObject

+ (NSString *) classString;
@end
// --------------------------
// myObject.m
#import "myObject.h"
@implementation myObject

+ (NSString *) classString {
    return [otherObject otherClassString];   
}

@end

// otherObject.h
#import <Foundation/Foundation.h>

@interface otherObject : NSObject

+ (NSString *) otherClassString;

@end

// otherObject.m
#import "otherObject.h"

@implementation otherObject

+ (NSString *) otherClassString {
    NSString *result = [[NSString alloc] initWithString:@"Hello World"];
    return result;
}

@end
// --------------------------
...