为啥创建NSString实例时没有星号[关闭]

Posted

技术标签:

【中文标题】为啥创建NSString实例时没有星号[关闭]【英文标题】:Why no asterisk sign when creating instance of NSString [closed]为什么创建NSString实例时没有星号[关闭] 【发布时间】:2013-12-20 07:22:16 【问题描述】:
NSString listOfNames = @"..."; // a long list of names
NSString name = @"Ward";
NSRange match = [listOfNames rangeOfString:name];
if (match.location == NSNotFound) 
    NSLog(@"No match found!");
    // Other actions to be taken
 else 
    NSLog(@"Match found!");
    // Other actions to be taken

为什么第一、二、三行代码不用星号这样

NSString *listOfNames = @"..."; 
NSString *name = @"Ward";
NSRange *match = [listOfNames rangeOfString:name];

【问题讨论】:

你真的试过编译这段代码吗?您可能会发现它不起作用。顺便说一句,NSRange 不是一个 Objective-C 类,所以它实际上不需要* 试试这个***.com/questions/1172600/… 对不起,这是书籍错误,不,我没有尝试运行代码,因为我一直认为书籍是正确的。下次问任何问题之前,我会尝试运行代码。对不起。 请分享书名和作者,以免其他学习者最终从该书/作者那里学习。 【参考方案1】:
 NSString* str = [NSString stringWithString:@"Blah..."];

注意NSString 后面的*。你在这里工作目标 C 所以指向对象的指针!

【讨论】:

【参考方案2】:
NSString listOfNames = @"..."; // a long list of names
NSString name = @"Ward";
NSRange match = [listOfNames rangeOfString:name];

前两行正在创建NSString 的对象。 NSStringNSObject 的子类,所有NSObject 及其子类都应该有*(与之关联的指针符号)。

虽然NSRange 是一个结构不在NSObject@ 的继承链中,因此不需要指针符号,但在某些情况下您也可以指向 NSRange。

*你上面的代码会出现编译错误。

您需要将其用作:

NSString *listOfNames = @"..."; // a long list of names
NSString *name = @"Ward";
NSRange match = [listOfNames rangeOfString:name];

【讨论】:

为什么 NSRange 不需要星号? 如果您希望可以创建 nsrange 的指针,但您真的需要该指针吗?大多数情况下,您直接需要该值。【参考方案3】:

我认为我们无法执行此代码,如果执行此代码会出错。

【讨论】:

【参考方案4】:

这是我在尝试做同样的事情时通常会看到的。 XCode 会自动提示您在属性名称前添加“*”。

【讨论】:

【参考方案5】:

通常在 Cocoa 对象中,你总是声明一个指针,所以你总是使用星号。您不能将对象本身放入变量中;你总是处理一个指向对象的指针。

对于其他对象 如果变量包含的对象,那么你不要使用星号,因为你没有在其中放置一个指针。如果它包含一个指针,那么你确实用星号声明它。

【讨论】:

等一下,您刚才说我们不能将对象本身放入变量中,但在第二段中您说变量包含对象。

以上是关于为啥创建NSString实例时没有星号[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥没有创建 IRtcEngine 实例?

NS前缀是什么意思?

我的 OpsWorks 实例在关闭五分钟后自行启动 - 为啥?

为啥对函数的 VLA 数组参数使用星号“[*]”而不是整数?

在 Xcode Playground 中将 NSString 转换为 CString

在Object-C 中的 NSArray,NSString…… NS到底是啥??