可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have an NSString
and I want to check if it has a NULL
value. If it does, then the if
condition should execute. Else it should execute the else
condition.
Below is the code which I am using:
if ([appDelegate.categoryName isEqual:[NSNull null]])
{
select = [[NSString alloc] initWithFormat:@"select * FROM ContentMaster LEFT JOIN Category ON ContentMaster.CategoryID=Category.CategoryID where ContentMaster.ContentTagText='%@'", appDelegate.tagInput];
}
else
{
select = [[NSString alloc] initWithFormat:@"select * FROM ContentMaster LEFT JOIN Category ON ContentMaster.CategoryID=Category.CategoryID LEFT JOIN Topic ON ContentMaster.TopicID=Topic.TopicID where ContentMaster.ContentTagText='%@' && Category.CategoryName='%@' && Topic.TopicName='%@'", appDelegate.tagInput, appDelegate.categoryName, appDelegate.topicName];
}
It always executes the else
condition, and never the if
condition, even when the value is NULL
.
回答1:
In Objective-C and Cocoa, the property may not be set—that is, it's nil
—or it may be set to the object representation of nil
, which is an instance of NSNull
. You probably want to check for either of these conditions, like this:
NSString* categoryName = appDelegate.categoryName;
if (categoryName == nil || categoryName == (id)[NSNull null]) {
// nil branch
} else {
// category name is set
}
This will execute the nil branch if the categoryName
property is set to nil
(the default for all properties), or if it's been explicitly set to the NSNull
singleton.
回答2:
The NULL value for Objective-C objects (type id) is nil.
While NULL is used for C pointers (type void *).
(In the end both end up holding the same value (0x0). They differ in type however.)
In Objective-C:
nil (all lower-case) is a null pointer to an Objective-C object.
Nil (capitalized) is a null pointer to an Objective-C class.
NULL (all caps) is a null pointer to anything else (C pointers, that is).
[NSNull null] (singleton) for situations where use of nil is not possible (adding/receiving nil to/from NSArrays e.g.)
So to check against NSNull one can either use:
if ((NSNull *)myString == [NSNull null])
or if one wants to omit the need of casting to NSNull:
if ([myString isKindOfClass:[NSNull class]])
回答3:
Try to use this. Check your value is kind of NULL class or not rather than comparing Pointers value.
if ([appDelegate.categoryName isKindOfClass:[NSNull class]]){
select = [[NSString alloc] initWithFormat:@"select * FROM ContentMaster LEFT JOIN Category ON ContentMaster.CategoryID= Category.CategoryID where ContentMaster.ContentTagText='%@'",appDelegate.tagInput];
}
else {
select = [[NSString alloc] initWithFormat:@"select * FROM ContentMaster LEFT JOIN Category ON ContentMaster.CategoryID= Category.CategoryID LEFT JOIN Topic ON ContentMaster.TopicID=Topic.TopicID where ContentMaster.ContentTagText='%@' && Category.CategoryName='%@' && Topic.TopicName='%@'",appDelegate.tagInput,appDelegate.categoryName,appDelegate.topicName];
}
回答4:
#define SAFESTRING(str) ISVALIDSTRING(str) ? str : @""
#define ISVALIDSTRING(str) (str != nil && [str isKindOfClass:[NSNull class]] == NO)
#define VALIDSTRING_PREDICATE [NSPredicate predicateWithBlock:^(id evaluatedObject, NSDictionary *bindings) {return (BOOL)ISVALIDSTRING(evaluatedObject);}]
SAFESTRING("PASS_OBJECT_HERE");
回答5:
Its better to be on safer side in checking null values , as it can lead to crash.
if (![string isKindOfClass:[NSNull class]] && string && string != NULL)
回答6:
Use the following code:
-(void)viewDidLoad {
[super viewDidLoad];
//Example - 1
NSString *myString;
if([[self checkForNull:myString] isEqualToString:@""]){
NSLog(@"myString is Null or Nil");
}
else{
NSLog(@"myString contains %@",myString);
}
//Example - 2
NSString *sampleString = @"iOS Programming";
if([[self checkForNull:sampleString] isEqualToString:@""]){
NSLog(@"sampleString is Null or Nil");
}
else{
NSLog(@"sampleString contains %@",sampleString);
}
}
-(id)checkForNull:(id)value{
if ([value isEqual:[NSNull null]]) {
return @"";
}
else if (value == nil)
return @"";
return value;
}
In Example -1, myString contains nothing. So the output is:
myString is Null or Nil
In Example -2, sampleString contains some value. So the output is:
sampleString contains iOS Programming
回答7:
+(BOOL)isEmpty:(NSString *)str{
if (str == nil || str == (id)[NSNull null] || [[NSString stringWithFormat:@"%@",str] length] == 0 || [[[NSString stringWithFormat:@"%@",str] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length] == 0){
return YES;
}
return NO;
}
Just pass your string in Method :)
回答8:
You can do it by using - [NSNull class]
if ([appDelegate.categoryName isEqual:[NSNull class]])
{
select = [[NSString alloc] initWithFormat:@"select * FROM ContentMaster LEFT JOIN Category ON ContentMaster.CategoryID=Category.CategoryID where ContentMaster.ContentTagText='%@'", appDelegate.tagInput];
}
else
{
select = [[NSString alloc] initWithFormat:@"select * FROM ContentMaster LEFT JOIN Category ON ContentMaster.CategoryID=Category.CategoryID LEFT JOIN Topic ON ContentMaster.TopicID=Topic.TopicID where ContentMaster.ContentTagText='%@' && Category.CategoryName='%@' && Topic.TopicName='%@'", appDelegate.tagInput, appDelegate.categoryName, appDelegate.topicName];
}
回答9:
Add an additional check for length also. This will definitely work.
if ([appDelegate.categoryName isEqual:[NSNull null]] && appDelegate.categoryName.length>0){
select = [[NSString alloc] initWithFormat:@"select * FROM ContentMaster LEFT JOIN Category ON ContentMaster.CategoryID= Category.CategoryID where ContentMaster.ContentTagText='%@'",appDelegate.tagInput];
} else {
select = [[NSString alloc] initWithFormat:@"select * FROM ContentMaster LEFT JOIN Category ON ContentMaster.CategoryID= Category.CategoryID LEFT JOIN Topic ON ContentMaster.TopicID=Topic.TopicID where ContentMaster.ContentTagText='%@' && Category.CategoryName='%@' && Topic.TopicName='%@'",appDelegate.tagInput,appDelegate.categoryName,appDelegate.topicName];
}
回答10:
NSString *str;
if ([[str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] isEqualToString:@""] || str==nil)
{
}