繁体   English   中英

Objective-C语法

[英]Objective-C syntax

我已经学习了几天的objective-c。 我不断遇到以下两种结构:

  1. NSString *一些字符串

  2. (NSString *)somestring

我了解第一个仅设置指向NSString对象的指针,但是第二个构造函数做什么,何时使用它? 星号怎么处理?

抱歉,如果这个问题没有任何意义,我对这种语言是全新的,甚至还没有达到提出适当问题的水平。

主要目的-我试图破译这种方法:

-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger) row forComponent: (NSInteger)component

**此外,我选择的课程也没关系。 **

您要了解的是方法声明语法。 在Objective-C中,方法的名称doSomethingWith:andAlso:inMode: 每个冒号都在参数之前。 在声明或定义方法时,还可以指定变量的类型及其名称。 该类型在括号中给出。 您还可以在实例前面加上- (例如实例方法)和+对于静态方法)以及(括号)返回类型。 现在,你有

- (NSString*)   pickerView:(UIPickerView*)pickerView
               titleForRow:(NSInteger)row
              forComponent:(NSInteger)component
{
  ...
}

解密时,我们发现:

  1. - :这是一个实例方法。
  2. (NSString*) :返回类型NSString*
  3. pickerView:方法名称的第一部分。
  4. (UIPickerView*)pickerView :第一个参数; 其名称为pickerView ,类型为UIPickerView*
  5. titleForRow:方法名称的第二部分。
  6. (NSInteger)row :第二个参数; 它的名称是row ,其类型是NSInteger
  7. forComponent:方法名称的第三部分。
  8. (NSInteger)component :第三个参数; 它的名称是component ,其类型是NSInteger

因此,将它们放在一起,就定义了实例方法pickerView:titleForRow:forComponent: 它返回一个NSString* ,它接受的三个参数分别是UIPickerView*NSIntegerNSInteger类型。 该方法称为[obj pickerView:myPV titleForRow:myRow forComponent:myComponent]

仅供参考:孤立地,如果您有NSString* str ,它将声明一个NSString*类型的变量; 并且如果您具有(NSString*)obj ,它将(强制)将该对象转换为NSString*类型。 这与方法声明语法无关。


编辑1:我还看到您在询问星号。 在(Objective-)C中,这表示一个指针 例如,如果您有一个int x ,则当您写int y = x然后y = 3x的原始值不变。 但是,如果您具有int* px ,则可以编写px = &x (请注意,整数,声明为int ,比声明为INT指针一个完全不同的数据类型int* 。写作int y = &x是垃圾,因为是int* py = x ,等)。这&是在“地址的“运算符” 它找到x在内存中的位置并返回。 现在,如果您先写int* py = px ,然后py = &y ,则不会更改px 但是,如果您编写*px ,则可以访问x当前存储的值, 并且可以更改它*px = 42x设置为42 由于各种原因,在处理对象时,人们倾向于喜欢使用对它们的引用而不是其实际值。 因此,在Objective-C中,您只能通过指针处理对象。 这意味着您将永远不会看到NSMutableArray x ,只会看到NSMutableArray* x 并且如果您有NSMutableArray* y = x ,则xy大致相同,并且调用[x addObject:obj]也会影响y 那里有更全面的教程-如果您不了解指针,则值得进行检查-但这足以作为概述。


编辑2 :在另一条评论中,您说您来自Ruby和Python。 在Ruby(我认为是Python,但我使用的更少)中,每个变量都是一个引用。 这意味着应该熟悉对象类型的指针的基本用法。 只要您从不使用&* ,它们的作用几乎相同。 指针和引用之间的区别在于,您可以获取对对象的引用并创建指向指针的指针。 例如,许多方法都以...error:(NSDictionary**)error结尾。 有效地提供了额外的返回值; 在该方法中,如果出现问题,他们可以编写*error = myErrorInfo 由于函数参数已复制,因此error = myErrorInfo将不可见; 但是,指针的引用对象仍然相同,因此可以将其分配给它。 如果然后编写如下代码:

NSDictionary* errorDict = nil;
[obj unsafeOperation:@"http://stackoverflow.com" error:&errorDict];

您传入一个指向 errorDict指针 ,以便unsafeOperation:error:方法可以写入errorDict并可以看到它。

mebFace-星号表示指针。 因此,只要您看到(例如)“ NSString *”,就表示您正在处理指向NSString对象的指针。 您尝试解密的方法将返回一个指向字符串的指针作为结果。 它包含三个参数:指向UIPickerView的指针,后跟几个整数。 您不将星号与整数结合使用的原因是因为它们是简单的整数-不是对象。

您可能应该从阅读有关C编程语言的书开始。 这就是Objective-C的基础。

戴夫

第一个是变量声明,第二个是类型转换。 somestring的类型不是NSString*因此您将其类型转换为NSString* 我认为,后一种情况通常(即使不是总是)在赋值语句的右侧看到。

在ObjectiveC中,它来自C,还用于许多其他严格类型的语言,例如Java,C#等。

在更新的问题中,您的方法签名定义了该方法返回指向NSString- (NSString *)指针。 它接受3个参数:

  • 指向UIPickerView对象的指针;
  • 行数;
  • 列数;

令人困惑的是,在Objective-c中,您的两个示例在不同上下文中的含义不同。

当声明一个变量(在其他地方,但不是在其他所有地方 )时,星号表示“指向”的指针,即…

int foo;  // An int variable
int *bar; // A pointer to an int

当涉及到objective-c对象时,我们主要处理指向它们的指针,即..您将不会看到它。

NSString myString;

你将永远看到这个

NSString *myString;

原因很复杂,但与对象的内存分配位置(堆)以及将变量传递给函数或方法会发生什么有关。 作为参数的方法传递的值被复制。 事实证明,将字符串传递给方法时复制字符串可能不是我们想要的,因此我们将指针传递给字符串,然后将其复制。 想象一个包含Shakesphere完整作品的字符串,大约500万字节。 每次将其传递给方法时,将其复制都是低效率的,但是指向它的指针只有4个字节,并且指针使我们对数据的访问也一样好,因为它指向了它。 对于int参数tho,这种方法不会给我们带来任何好处,因为int和指向int的指针将具有相同的大小(或至少相等)。

您的第二个示例是方法或方法声明。 将其与javascript之类的函数定义进行比较可能会有所帮助:

function pickerViewTitleForRowForComponent( pickerView, row, component ) {
    ...do something here
    return result;
}

Objective-c的功能要好一些,对不起,我的意思有所不同。 以上基本上看起来像

- pickerView: pickerView titleForRow: row forComponent: component {
    ...do something here
    return result;
}

参数是相同的:pickerView,行和组件。 但是,上述方法无效,因为它缺少类型信息。 即。 我们必须明确地说出每个参数是什么类型,以及从方法返回的对象的类型。

- (return type)pickerView:(argument type)pickerView titleForRow:(argument type)row forComponent:(argument type)component {
    ...do something here
    return result;
}

如您所见,在您的示例中:

返回类型>指向NSString对象的指针-(NSString *)

参数1类型>指向UIPickerView对象的指针-(UIPickerView *)

参数2类型> NSInteger-(NSInteger)

参数3类型> NSInteger-(NSInteger)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM