2011-05-13 6 views
0

대개 매우 간단한 퀘스트에서 문제가 발생했습니다. 정수, NSString 및 NSDate를 포함하는 사용자 정의 클래스를 만들고 싶습니다. 그러나, 내 예제에서는 개체를 저장할 때 내 문제를 표시하는 경우에만 NSString을 사용합니다.자체 생성 클래스에 대한 NSUserDefaults

이 내 클래스 헤더입니다 : # import를

@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 

내의 ViewController가 아니라 UILabel의 레이블 불렀다 작성 및 읽기라는 두 개의 버튼이 있습니다.

#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 오류 중 하나를 얻거나 올바르게 처음과 충돌을 표시합니다 :

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

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

난 단지 내가 여기에 편집 한 기능이 표시됩니다 그것을 다시 할 때 같은 오류가 발생합니다. 내가 뭘 잘못하고 있니?

self.myString = @"Hi"; 

또는 :

답변

1

당신이 원하는 마찬가지로

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

를, 당신의 dealloc는이 있어야합니다

self.myString = nil; 

또는

[myString release]; 
+0

내가 네브라스카 내 문자열에 어떤 메모리도 할당하지 않은 채로 릴리스 했습니까? 내가 명시 적으로 할당되지 않은 NSStrings autoreleased –

+0

@ 데이비드 생각, 당신은 개체를 할당하지 않았지만 당신이 그것에 대한 참조를 잡고있어 때문에 당신은 정확하게 필요합니다. 그리고 객체를 유지 한 후에는 객체를 끝내야합니다. 나쁜 포인터를 가지고 있기 때문에 EXC_BAD_ACCESS가 표시됩니다. 즉, 코 바로 아래에서 할당 해제되는 개체에 대한 포인터입니다. – Caleb

+0

myString = @ "Hi"와 self.myString = @ "Hi"의 차이점을 알지 못했습니다. 고마워. –

관련 문제