私はこれに対する答えを探していましたが、問題を解決する方法をまだ解決できていません。この-[NSNull length]: unrecognized selector sent to instanceおよび this [NSNull length]: unrecognized selector sent to instance 0x43fe068は役に立ちませんでした。
Parse バックエンドを備えたチャット アプリで作業していますが、チャット メッセージのタイムスタンプに問題があり、順序が正しくないため、Databrowser を使用して Parse データベースから順序が正しくない行を削除しました。アプリをテストしたところ、iOS 8 を実行している iPhone 6 Plus と iPhone 6 シミュレーターで問題が解決したように見えました。ただし、iOS 7 を実行している iPhone 5s で同じチャット ルームを開くと、アプリは一貫してクラッシュします。次のエラー。
-[NSNull length]: unrecognized selector sent to instance
行を削除するとこれが発生する理由と、iOS 7 でのみ発生する理由がわかりません。All Exceptions Breakpoint を設定しました。問題のある行とスクリーンショットを次に示します。
self.lastMessageLabel.textColor = [UIColor redColor];
NSNull length
上記の行をコメントアウトしてもまだクラッシュしますが、一般的な main.m で壊れます。
これを解決する方法についての提案をいただければ幸いです。ありがとう。
編集 1:これは、私の PrivateInbox によって読み込まれている ChatView.m のコードです。
- (void)loadMessages {
if (isLoading == NO)
{
isLoading = YES;
JSQMessage *message_last = [messages lastObject];
PFQuery *query = [PFQuery queryWithClassName:PF_CHAT_CLASS_NAME];
[query whereKey:PF_CHAT_ROOM equalTo:chatroomId];
if (message_last != nil) {
[query whereKey:PF_CHAT_SENTDATE greaterThan:[self.dateFormatter stringFromDate:message_last.date]];
}
[query includeKey:PF_CHAT_USER];
[query orderByAscending:PF_CHAT_SENTDATE];
[query addAscendingOrder:PF_CHAT_CREATEDAT];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error)
{
if (error == nil)
{
for (PFObject *object in objects)
{
PFUser *user = object[PF_CHAT_USER];
[users addObject:user];
if(![object[PF_CHAT_TEXT] isKindOfClass:[NSNull class]]) {
NSDate* sentDate;
if(object[PF_CHAT_SENTDATE] != nil)
sentDate = [self.dateFormatter dateFromString:object[PF_CHAT_SENTDATE]];
else
sentDate = object.createdAt;
JSQTextMessage *message = [[JSQTextMessage alloc] initWithSenderId:user.objectId senderDisplayName:user.objectId date:sentDate text:object[PF_CHAT_TEXT]];
[messages addObject:message];
} else if(object[PF_CHAT_PHOTO] != nil) {
NSDate* sentDate;
if(object[PF_CHAT_SENTDATE] != nil)
sentDate = [self.dateFormatter dateFromString:object[PF_CHAT_SENTDATE]];
else
sentDate = object.createdAt;
PFFile* photoFile = object[PF_CHAT_PHOTO];
JSQPhotoMediaItem *photoItem = [[JSQPhotoMediaItem alloc] init];
JSQMediaMessage *photoMessage = [[JSQMediaMessage alloc] initWithSenderId:user.objectId
senderDisplayName:user.objectId
date:sentDate
media:photoItem];
[messages addObject:photoMessage];
{
[photoFile getDataInBackgroundWithBlock:^(NSData *data, NSError *error) {
photoItem.image = [UIImage imageWithData:data];
[self.collectionView reloadItemsAtIndexPaths:[NSArray arrayWithObjects:[NSIndexPath indexPathForItem:[messages indexOfObject:photoMessage] inSection:0], nil]];
}];
}
} else if(object[PF_CHAT_VIDEO] != nil) {
NSDate* sentDate;
if(object[PF_CHAT_SENTDATE] != nil)
sentDate = [self.dateFormatter dateFromString:object[PF_CHAT_SENTDATE]];
else
sentDate = object.createdAt;
PFFile* videoFile = object[PF_CHAT_VIDEO];
JSQVideoMediaitem *videoItem = [[JSQVideoMediaitem alloc] initWithFileURL:[NSURL URLWithString:[videoFile url]] isReadyToPlay:YES];
JSQMediaMessage *videoMessage = [[JSQMediaMessage alloc] initWithSenderId:user.objectId
senderDisplayName:user.objectId
date:sentDate
media:videoItem];
[messages addObject:videoMessage];
}
}
if ([objects count] != 0) {
[JSQSystemSoundPlayer jsq_playMessageReceivedSound];
[self resetUnreadCount];
[self finishReceivingMessage];
}
}
else [ProgressHUD showError:@"Network error."];
isLoading = NO;
}];
}
}
編集 2: Nick Lockwood https://github.com/nicklockwood/NullSafeから NSNullSafe を試してみたところ、プライベート受信トレイがクラッシュすることなく開くことができ、NSNull Length エラーを回避できましたが、それは問題を覆い隠しているだけだと思います。 iOS 8 ではクラッシュしなかったのに、iOS 7 ではクラッシュした理由がわかりません。