2012-04-28 96 views
0

我有以下屬性定義的:在dealloc中釋放的ivars給「指針被釋放沒有分配」的錯誤

@property (nonatomic, retain) NSString *name_; 
@property (nonatomic, retain) NSString *profilePicture_; 
@property (nonatomic, retain) NSString *username_; 
@property (nonatomic, retain) NSString *id_; 

,我讓他們開我的init...這樣的:

-(id)initWithData:(NSDictionary *)data 
{ 
    self = [super init]; 
    if (!self) { 
     return nil; 
    } 

    name_ = [data valueForKey:@"full_name"]; 
    profilePicture_ = [data valueForKey:@"profile_picture"]; 
    username_ = [data valueForKey:@"username"]; 
    id_ = [data valueForKey:@"id"]; 


    return self; 
} 

與以下dealloc

-(void)dealloc 
{ 
    [name_ release]; 
    [username_ release]; 
    [profilePicture_ release]; 
    [id_ release]; 
    [super dealloc]; 
} 

然而dealloc給我一封rror:

pointer being freed was not allocated

這是爲什麼?我必須做[[NSString alloc] init...][NSString stringWithString:]

+0

什麼是您的Xcode版本?在3.x中有一個問題(不記得一個)... – Kuba 2012-04-28 16:15:29

回答

1

這是因爲您在initWithData中分配給支持變量。您應該使用重寫代碼如下:

self.name_ = [data valueForKey:@"full_name"]; 
self.profilePicture_ = [data valueForKey:@"profile_picture"]; 
self.username_ = [data valueForKey:@"username"]; 
self.id_ = [data valueForKey:@"id"]; 

這將通過性能,這對於您來電[retain]賦值。您的代碼現在寫入的方式只需將指針複製到ivars中,而不會調用[retain],這最終會導致您描述的問題。

+0

或者合成變量:synthesize name_ = _name_; – Kuba 2012-04-28 16:16:31

+0

@SimpleMan在使用Xcode 4.x以前版本發佈的Objectice C中可以使用這種語法嗎? – dasblinkenlight 2012-04-28 16:18:00

+1

@dasblinkenlight我認爲這是我一直合成高德這樣的,我開始的Xcode 3.x中 – 2012-04-28 16:23:34

5

valueForKey:將返回一個自動釋放的對象,所以你沒有所有權。由於他們都是字符串,你可以叫copy這樣

name_   = [[data valueForKey:@"full_name"] copy]; 
profilePicture_ = [[data valueForKey:@"profile_picture"] copy]; 
username_  = [[data valueForKey:@"username"] copy]; 
id_    = [[data valueForKey:@"id"] copy]; 

你也應該改變你的@property聲明使用copy,因爲這是一般建議字符串。

另一種方法是要經過合成的訪問器,但我通常避免由於您使用的詞典數據,你應該設置通過使用自關鍵字屬性值要麼initdealloc

0

這樣做。

如果不解決,那麼問題可能不是你的類裏,但也許在您創建它的實例。嘗試檢查您分配和釋放此類的實例的代碼。

你也應該使用模擬器& NSZombiesň確定要在其中過度釋放對象配置您的應用程序。

相關問題