Ios 未调用NSString类别方法

Ios 未调用NSString类别方法,ios,objective-c,Ios,Objective C,我试图解决的问题是将nil字符串转换为空字符串,以便将其作为值放入NSDictionary 我有以下代码: //Accessed in class prospect.title = [self.titleLabel.text emptyWhenNil]; // NSString+Additions Category -(NSString *) emptyWhenNil { if(self == nil) return @""; return self; }

我试图解决的问题是将nil字符串转换为空字符串,以便将其作为值放入
NSDictionary

我有以下代码:

//Accessed in class  
prospect.title = [self.titleLabel.text emptyWhenNil];

// NSString+Additions Category

-(NSString *) emptyWhenNil
{
   if(self == nil)
      return @"";

   return self;
 }

但是由于某些原因,
emptyWhenNil
方法甚至从未被调用过!!我迷路了。

问题是,当您的字符串指针为
nil
时,您没有要向其发送该类别消息的对象。发送至
nil
的消息不会在Objective-C中执行(并返回
nil

如果要将“null”对象放入集合,例如
NSDictionary
NSArray
,则可以使用
NSNull

或者,您可以将此方法实现为类方法:

+ (NSString *)emptyStringIfNil:(NSString *)str {
    if (!str) return @"";
    return str;
}
然后你会称之为

prospect.title = [NSString emptyStringIfNil:self.titleLabel.text];

问题是,当字符串指针为
nil
时,您没有要向其发送该类别消息的对象。发送至
nil
的消息不会在Objective-C中执行(并返回
nil

如果要将“null”对象放入集合,例如
NSDictionary
NSArray
,则可以使用
NSNull

或者,您可以将此方法实现为类方法:

+ (NSString *)emptyStringIfNil:(NSString *)str {
    if (!str) return @"";
    return str;
}
然后你会称之为

prospect.title = [NSString emptyStringIfNil:self.titleLabel.text];

如果
NSString
指针为
nil
,则不会对其调用该方法,您可以做的是创建一个静态方法:

+ (NSString *) emptyIfNil:(NSString *) str
{
    return str == nil ? @"" : str;
}

如果
NSString
指针为
nil
,则不会对其调用该方法,您可以做的是创建一个静态方法:

+ (NSString *) emptyIfNil:(NSString *) str
{
    return str == nil ? @"" : str;
}

如果字符串为nil,则没有
self
可在其上执行该方法。在这种情况下,运行时的默认行为是返回默认的nil值

您应该将其实现为一个静态方法。大概是这样的:

+ (NSString *)emptyStringIfNil:(NSString *)input
{
    return input ? input : @"";
}

如果字符串为nil,则没有
self
可在其上执行该方法。在这种情况下,运行时的默认行为是返回默认的nil值

您应该将其实现为一个静态方法。大概是这样的:

+ (NSString *)emptyStringIfNil:(NSString *)input
{
    return input ? input : @"";
}


我确实导入了NSString+Additions.h文件。当用户单击UIButton时,我调用此方法。我确实导入了NSString+Additions.h文件。当用户单击UIButton时,我调用此方法。没有真正忽略,它们返回
nil
NO
0
。是的,但肯定不会执行。谢谢@DrummerB!!工作起来很有魅力:)@DrummerB消息永远不会执行,而是发送。在这里,它们被发送到
nil
,这在语义上与将消息发送到对象没有区别。消息不会被忽略并被执行。@Sulthan我知道Obj-C术语(正如苹果所建议的),但人们经常使用其他术语,谈论“调用”或“执行”方法。我认为这不值得争论。顺便说一句,你的第一句和最后一句是直接矛盾的。没有被真正忽略,它们返回
nil
NO
0
。是的,但肯定没有执行。谢谢@DrummerB!!工作起来很有魅力:)@DrummerB消息永远不会执行,而是发送。在这里,它们被发送到
nil
,这在语义上与将消息发送到对象没有区别。消息不会被忽略并被执行。@Sulthan我知道Obj-C术语(正如苹果所建议的),但人们经常使用其他术语,谈论“调用”或“执行”方法。我认为这不值得争论。顺便说一句,你的第一句和最后一句是直接矛盾的。哇,这样完整地写出来有点冗长-
returninput?:@:)据我所知,使用
?:
而不使用左手“then”表达式是一个GNU扩展,不能与所有编译器一起工作。好吧,这并不像我想象的那样容易,但它在-
条件运算符-三元运算符中。GNU“missing middle”扩展是一个BinaryConditionalOperator。
它仍然是一个扩展,不是标准的或可移植的。有些人关闭了带有警告和其他编译器标志的扩展。我个人不会在SO答案或任何库代码中使用它。哇,这样完整地写出来有点冗长-
返回输入?:@:)据我所知,使用
?:
而不使用左手“then”表达式是一个GNU扩展,不能与所有编译器一起工作。好吧,这并不像我想象的那样容易,但它在-
条件运算符-三元运算符中。GNU“missing middle”扩展是一个BinaryConditionalOperator。
它仍然是一个扩展,不是标准的或可移植的。有些人关闭了带有警告和其他编译器标志的扩展。我个人不会在SO答案或任何库代码中使用它。