2011-05-13 48 views
0

我在通常非常簡單的任務中遇到問題,我想創建一個包含整數,NSString和NSDate的自定義類。但是,在我的示例中,我僅使用NSString在存儲對象時顯示我的問題。自創類的NSUserDefaults

這是我的類的頭: #進口

@interface MyClass : NSObject <NSCoding> { 
    NSString * myString; 
} 
@property (retain) NSString * myString; 
@end 

和我的身體:

#import "MyClass.h" 

@implementation MyClass 
@synthesize myString; 

- (id)initWithCoder:(NSCoder *)coder { 
    self = [super init]; 
    if (self) { 
     myString = [coder decodeObjectForKey:@"myString"]; 
    } 
    return self; 
} 
- (id)init { 
    self = [super init]; 
    if (self) { 
     myString = @"Hi"; 
    } 
    return self; 
} 

- (void)encodeWithCoder:(NSCoder *)aCoder{ 
    [aCoder encodeObject: myString forKey:@"myString"]; 
} 

- (void)dealloc { 
    myString = nil; 
    [super dealloc]; 
} 
@end 

我的視圖控制器包含兩個按鈕稱爲創建和讀取,以及一個UILabel稱爲標籤。

#import <UIKit/UIKit.h> 
@interface UserDefaultsTestViewController : UIViewController { 

    IBOutlet UILabel *label; 
} 
- (IBAction)pushCreate; 
- (IBAction)pushLoad; 
@end 

我將只顯示功能,我在這裏編輯:

#import "UserDefaultsTestViewController.h" 
#import "MyClass.h" 
- (IBAction)pushCreate { 
    MyClass * myClass = [[MyClass alloc] init]; 
    NSData * data = [NSKeyedArchiver archivedDataWithRootObject:myClass]; 
    NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setObject:data forKey:@"Test"]; 
    [myClass release]; 
} 

- (IBAction)pushLoad { 
    NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults]; 
    NSData * atchive = [defaults objectForKey:@"Test"]; 
    MyClass * myClass = [NSKeyedUnarchiver unarchiveObjectWithData:atchive]; 
    label.text = myClass.myString; 
} 

但是,如果我跑我的代碼,我得到無論是EXC_BAD_ACCESS錯誤或者正確地顯示在第一時間和崩潰當再次進行時,再次出現相同的錯誤。 我在做什麼錯?

回答

1

你想做的事:

self.myString = @"Hi"; 

或者:

myString = @"Hi"; 
[myString retain]; 

同樣,你的dealloc應該有:

self.myString = nil; 

[myString release]; 
+0

我甲腎上腺素編輯發佈通過我從來沒有分配任何內存給我的字符串?我認爲NSStrings沒有明確分配的是自動發佈的 – 2011-05-13 20:37:01

+0

@David,你需要一個--retain,因爲你沒有分配對象,但你堅持對它的引用。當你保留這個對象後,你需要在完成之後釋放它。你得到了EXC_BAD_ACCESS,因爲你有一個糟糕的指針 - 也就是指向正在你的鼻子下被釋放的對象的指針。 – Caleb 2011-05-13 21:47:42

+0

我不知道myString = @「Hi」和self.myString = @「Hi」有區別。非常感謝 – 2011-05-13 22:43:06