【问题标题】:Can someone explain to me what (NSString *) means with Obj-C?有人可以向我解释 (NSString *) 对 Obj-C 的含义吗?
【发布时间】:2010-05-25 13:58:48
【问题描述】:

我刚开始使用 Objective-C,我想了解以下代码行的含义,因为我在 Objective-c 中随处可见,但我并没有完全理解 100%:

- (id)initWithName:(NSString *)name;

我知道上面这行是一个传递一个参数的实例方法,我不明白的是(NSString *)name。

另一个例子是:

-(NSString *)name;

person.height = (NSObject *)something;

感谢您的帮助

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    在这一行:

    - (id)initWithName:(NSString *)name;
    

    (NSString *) 只是参数的类型 - 一个字符串对象,它是 Cocoa 中的 NSString 类。在 Objective-C 中,您总是在处理对象引用(指针),因此“*”表示参数是对 NSString 对象的引用。

    在这个例子中:

    person.height = (NSObject *)something;
    

    发生了一些不同的事情:(NSObject *) 再次指定了一个类型,但这一次是一个“类型转换”操作——这意味着获取“某物”对象引用(可能是一个 @987654326 @、NSNumber 或 ...) 并将其视为对 NSObject 的引用。


    更新 - 在谈论 Objective-C 对象(与 int 或 float 等原始类型相反)时,一切最终都是一个指针,因此强制转换操作意味着“将此指针作为 X 并将其视为指向 Y” .例如,如果您有一个容器类(如 NSArray),其中包含通用 NSObjects,但您知道对象实际上是字符串,您可能会说:

    NSString *myString = (NSString *)[myArray objectAtIndex:0];
    

    这意味着“从数组中检索第一个对象,将其视为字符串”。

    强制转换实际上并没有转换值,它只是对编译器说“嘿,我知道我在这里将 X 分配给 Y,所以不要给我警告”。

    【讨论】:

    • 强制转换操作是否意味着改变值类型?意思是,如果期待一个 int,它会变成一个 bool,这是正确的吗?
    【解决方案2】:
    - (id)initWithName:(NSString*)name;
    

    是一种方法的签名,它采用一个名为name 的参数,该参数是指向NSString 的指针。

    -(NSString *)name;
    

    是一个名为name 的访问器方法,它返回指向NSString 的指针。

    person.height = (NSObject *)something;
    

    something 类型转换为NSObject 指针,然后将其分配给person.height 属性。

    更多解释见Learning Objective-C: A Primer

    【讨论】:

      【解决方案3】:
      - (id)initWithName:(NSString *)name;
          -----------------------------------------
          '-'  means its an instance method (+ is used for static methods)
          '(id)' is the return type    
          'initWithName' is the function name, the name implies its a constructor
          ':' start of parameter
          '(NSString*)' parameter type
          'name' parameter name
      

      相当于

      (id)initWithName( NSString* name )
      

      【讨论】:

        【解决方案4】:
        (NSString *)name
        

        是说变量name 是指向NSString 对象的指针*。它是一个指针,因为name 变量不是字符串,而只是该字符串在内存中的地址。

        【讨论】:

        • 这是否意味着我可以访问NSString类的所有方法和属性?假设 NSString 类有一个名为 doSomething 的方法,那么可以做 [name doSomething] 吗?
        • 只是为了确定。所以如果我有 -(id)initWithName:(NSString*)name;然后在 initWithName 方法中我可以做 [name soSomething]?
        • 是的,不仅仅是参数是(NSString *)name,它可以是任何对象类型(NSObject *)name(MyObjPerson *)person
        猜你喜欢
        • 2022-11-03
        • 2015-03-30
        • 2021-10-14
        • 1970-01-01
        • 2011-05-08
        • 1970-01-01
        • 2012-04-09
        • 2021-02-18
        • 1970-01-01
        相关资源
        最近更新 更多