Xcodeでその内容EXC_BAD_ACCESS
を試したときにいつでも提供する単純なコアデータオブジェクトがあります。NSLog
管理対象オブジェクトは次のようになります。
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@class ChatFriend, ChatMessage;
@interface ChatThread : NSManagedObject
@property (nonatomic, retain) NSString * threadId;
@property (nonatomic, retain) NSDate * timestamp;
@property (nonatomic, retain) NSSet *friends;
@property (nonatomic, retain) NSSet *messages;
@end
@interface ChatThread (CoreDataGeneratedAccessors)
- (void)addFriendsObject:(ChatFriend *)value;
- (void)removeFriendsObject:(ChatFriend *)value;
- (void)addFriends:(NSSet *)values;
- (void)removeFriends:(NSSet *)values;
- (void)addMessagesObject:(ChatMessage *)value;
- (void)removeMessagesObject:(ChatMessage *)value;
- (void)addMessages:(NSSet *)values;
- (void)removeMessages:(NSSet *)values;
@end
これは.m
ファイルです:
#import "ChatThread.h"
#import "ChatFriend.h"
#import "ChatMessage.h"
@implementation ChatThread
@dynamic threadId;
@dynamic timestamp;
@dynamic friends;
@dynamic messages;
- (NSString*) description
{
/* This can print out the contents of self.messages correctly
for(ChatMessage *message in self.messages)
{
Log(@"ChatMessage - %@", message);
}
*/
// using %@ to print out self.messages directly, will fail:
return [NSString stringWithFormat:@"ChatThread - threadId:%@, messages count:%d, messages:%@", self.threadId, self.messages.count, self.messages];
}
@end
stringWithFormat
行のself.messagesの内容を印刷しようとすると、EXC_BAD_ACCESS
発生することに気づきました。self.messagesを削除すると、印刷するだけself.messages.count
で機能します。手動でforループを実行してメッセージ内の各メッセージを出力するNSSet
と、それは機能し、そこにいくつかの値があることを証明します。
では、なぜself.messagesを直接印刷するとトリガーされるのEXC_BAD_ACCESS
でしょうか。