我对此代码有几个问题:
#import "ViewController.h"
@interface ViewController ()
@property (copy, nonatomic) NSArray *myArray;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.myArray= @[@"one", @"two", @"three", @"four"];
}
我知道self关键字意味着该方法将被发送到该消息的接收者,并且我知道何时以及如何使用它,如果我正在创建一个简单的命令实用程序代码,但在学习创建iPhone应用程序和使用时故事板每当我看到它让我困惑的自我关键词时,我不知道哪个对象是接收者
第二个问题,我知道@[@"object", @"object"];
是创建NSArray
对象的快捷方式,但“myArray”属性不是NSArray
对象。请解释一下,谢谢。
答案 0 :(得分:1)
self
始终对应于自我类。因此,班级的每个实例都有自己的自我。
在您的情况下,myArray
是Class ViewController的属性。您可以在此处使用self.myArray
或_myArray
。
在以下语句中,您将创建一个包含四个字符串的数组,并将其添加到myArray
。
self.myArray= @[@"one", @"two", @"three", @"four"];
问题中的措辞:
我知道self关键字意味着将该方法发送给 该消息的接收者
对于您将其用作以下内容的方法调用有效:
[self aMethod];
即使在此,您也在调用一个类的方法。如果你调用任何不属于当前(自我)类的方法,那么你可以通过使用该类来调用它。对象名称为:
SomeClass *someClassObject = ...
[someClassObject itsMethod];
答案 1 :(得分:1)
myArray
是。正如你所说,财产的名称。默认情况下,编译器将创建一个名为_myArray
的实例变量,该变量由该属性使用。在任何情况下,因为您已声明属性为NSArray *
类型(而非readonly),您可以为其指定一个数组。
self
关键字只是指向“当前”对象的指针,当您键入“self”时,您正在编写代码的类的某个实例。如果您为self.myArray
分配内容,则进行该分配的类需要具有myArray
属性。在您的代码示例中,self
是指向仅加载其视图的ViewController
的特定实例的指针。当您使用故事板编写iPhone分配时,这些都不会改变。 self
总是接收使用self
的方法的对象。 (注意:当在类方法中使用时,即以+
开头的方法,接收方法的对象是类本身,而不是类的实例。如果听起来有点混乱,请不要担心 - 它不会经常出现。)
如果您发现self.myArray
这样的表达式令人困惑,则可能有助于了解属性语法只是方法调用的简写。此外,像这样的表达式中的self
根本不是特殊的。语法为foo.bar
其中foo
任何对象指针(包括self
)和bar
都可以是foo
指向的对象的任何属性。该表达式直接转换为[foo bar]
或[foo setBar:...]
,具体取决于您是在阅读还是为该属性赋值。所以,
self.myArray = @[a, b, c];
表示完全与:
相同[self setMyArray:@[a, b, c]];
答案 2 :(得分:1)
“self”是指向该方法所属对象的指针。在您的情况下,您可能有许多ViewController
个实例,并且每个实例都可以调用viewDidLoad
,在该方法中,“self”是指向实例本身的指针。要从C透视图中查看它,您可以使用指向函数的指针创建一个方法,您也可以将自己的指针发送到名为“self”的函数,例如void foo(MyClass *self);
然后调用它myClassInstance->foo(myClassInstance);
这个过程类型模拟方法,但你总是需要发送实例指针(自我)。所以对于“自我”应该没有混淆,除了“this”关键词更常见。它只是对调用该方法的对象的引用。
该属性通常只是方便的2个方法,称为getter和setter。在创建属性@property NSArray *myArray
时,您实际上会生成一个指针NSArray *_myArray;
,然后是一个getter:
- (NSArray *)myArray {
return _myArray;
}
一个二传手
- (void)setMyArray:(NSArray *)myArray {
_myArray = myArray;
}
如何创建getter和setter取决于属性属性(strong,weak,readonly ......)。您甚至可以覆盖任何这些方法或两者。所以当你说“但是”myArray“是一个属性而不是NSArray对象”时,一个属性可以真正具有任何类型。