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錯誤或者正確地顯示在第一時間和崩潰當再次進行時,再次出現相同的錯誤。 我在做什麼錯?
我甲腎上腺素編輯發佈通過我從來沒有分配任何內存給我的字符串?我認爲NSStrings沒有明確分配的是自動發佈的 – 2011-05-13 20:37:01
@David,你需要一個--retain,因爲你沒有分配對象,但你堅持對它的引用。當你保留這個對象後,你需要在完成之後釋放它。你得到了EXC_BAD_ACCESS,因爲你有一個糟糕的指針 - 也就是指向正在你的鼻子下被釋放的對象的指針。 – Caleb 2011-05-13 21:47:42
我不知道myString = @「Hi」和self.myString = @「Hi」有區別。非常感謝 – 2011-05-13 22:43:06