2014-11-26 7 views
0

У меня возникла эта проблема в Xcode 6. Это нормально, если я использую это в Xcode 5 или ниже.проверка на наличие nil перед отправкой сообщения

Объекты автоматически создаются, даже если это nil и не могут проверить nil.

NSString *userID = [DataManager sharedInstance].currentUser.userId; 

if (!userID) { 
    userID = @"user"; 
} 
[userInfo setObject:userID forKey:LogDataUserIDKey]; 

Вот что я делаю, и я получаю EXE_BAD_ACCESS(code=1, address=0x443b800c) в последней строке. userID был создан как прикрепленный снимок экрана. Как проверить, нет ли userID. Я потерян. Пожалуйста, порекомендуйте. enter image description here

+1

Вы понимаете, что Xcode - это просто IDE? Этот вопрос не имеет ничего общего с Xcode. – dandan78

+0

попытались записать идентификатор пользователя перед установкой его в словаре и после инструкции if? – iHulk

+0

Если я поставил 'NSLog (@" userID:% @ ", userID),' сразу после 'userID', я также получил' EXC_BAD_ACCESS' –

ответ

0

OK. Я могу решить проблему. Это связано с тем, что внутри этого объекта User, который является [DataManager sharedInstance].currentUser, userId объявляется как переменной экземпляра, так и свойством.

@interface User : NSObject <NSCopying>{ 
NSString *userId; // instance variable 
} 
@property (nonatomic, retain) NSString * userId; 

Таким образом, удалив объявление переменной экземпляра и устранив проблему.

@interface User : NSObject <NSCopying> 
@property (nonatomic, retain) NSString * userId; 

Но, я не знаю, почему. Вы, ребята, знаете?

+0

Почему вы объявляете и ivar и свойство? – Nick

+0

@ Ник, это было уже так. Я унаследовал код от кого-то. –

+0

Я бы удалил объявление ivar и разрешил xcode автоматически синтезировать свойство '_userId'. Это позволяет избежать конфликта имен, и вы все равно можете добраться до ivar, если вам нужно. Существует хорошая вероятность, что одна из этих деклараций была ошибочной. – Nick

Смежные вопросы