Мой объект класса освобождается даже после его сохранения - PullRequest
0 голосов
/ 10 февраля 2011

Я пытался отладить эту ошибку, как в течение нескольких дней, и до сих пор не могу понять, что на самом деле происходит с моим объектом. Код выглядит так. - (BOOL) webView: (UIWebView *) webView shouldStartLoadWithRequest: (NSURLRequest *) запрашивает навигационный тип: (UIWebViewNavigationType) navigationType { // извлекать данные по нажатой ссылке

SongObject * Data = [[SongObject alloc] init]; [Данные сохраняются]; selectedSong = Data; }

selectedSong - это открытая переменная в основном классе, и теперь сумасшедшая вещь в том, что использование описанного выше метода работает везде, кроме плечаStartLoadWithRequest.

Попытка отменить ее выводит меня "Out of Scope", не может ли это быть по какой-то безумной причине, что shouldStartLoadWithRequest автоматически выпускает мой объект, даже когда я говорю "нет"?

Есть идеи?

Редактировать: Это файл H и M, который выбран для хранения в формате Song.

#import <Foundation/Foundation.h>
#import "SongObject.h"


@interface SongObject : NSObject<NSCopying> {
    NSString *artist;
    NSString *titel;
    NSString *album;
    NSString *genre;
    NSString *songUrl;
    NSString *rating;
    NSString *image;
    BOOL     local;
}
@property (readonly) NSString *getArtist;
@property (readonly) NSString *getTitle;
@property (readonly) NSString *getAlbum;
@property (readonly) NSString *getGenre;
@property (readonly) NSString *getSongURL;
@property (readonly) NSString *getRating;
@property (readonly) NSString *getImage;
@property (readonly) BOOL     isLocal;



-(void) setInfo:(NSString *) a: (NSString*) t: (NSString*) ab: (NSString*)g: (NSString*)sU: (NSString*)r: (NSString*) i: (BOOL) loc;
@end



#import "SongObject.h"


@implementation SongObject
-(id)init
{
    if(self =[super init])
    {
        NSLog(@"Init songobject");
    }
    return self;
}
-(id) copyWithZone: (NSZone *) zone {
    SongObject *newSong = [[SongObject allocWithZone:zone] init];
    NSLog(@"_copy: %@", [newSong self]);
    [newSong setInfo:[self getArtist] :[self getTitle] :[self getAlbum] :[self  getGenre] :[self getSongURL] :[self getRating] :[self getImage] :[self isLocal]];
    return(newSong);
}


-(void)dealloc
{
    NSLog(@"Songobject deallocted from memory...");
    [super dealloc];
}
-(void) setInfo:(NSString *) a: (NSString*) t: (NSString*) ab: (NSString*)g: (NSString*)sU: (NSString*)r: (NSString*) i: (BOOL) loc{
    artist = a;
    titel = t;
    album = ab;
    genre = g;
    songUrl = sU;
    rating = r;
    image = i;
    local = loc;
}

-(NSString*)getArtist
{
    return artist;
}

-(NSString*)getTitle
{
    return titel;
}

-(NSString*)getAlbum
{
    return album;
}

-(NSString*)getGenre
{
    return genre;
}

-(NSString*)getSongURL
{
    return songUrl;
}

-(NSString*)getRating
{
    return rating;
}

-(NSString*)getImage
{
    return image;
}
-(BOOL)isLocal{
    return local;
}

@end

Ответы [ 2 ]

0 голосов
/ 11 февраля 2011

Наконец-то я обнаружил, что проблема класса SongObject с переменными NSString никогда не сохранялась. Таким образом, selectedSong фактически никогда не выпускался, кроме переменных внутри класса. Исправил это, используя NSString alloc initWithString, а затем переопределив метод dealloc и выпустив их там.

0 голосов
/ 10 февраля 2011

Это кажется невозможным. Будьте осторожны, потому что вы увеличиваете счетчик ссылок в два раза. Один раз в выделении, и снова с сохранением. Как выглядит selectedSong? это свойство с автоматическим удержанием?

Кроме того, иногда я не могу прочитать объект в отладчике и использую NSLog. Что ты видишь тогда?

Как насчет переопределения -dealloc. Вы пытались установить точку останова там?

...