Ios 点语法和方括号

Ios 点语法和方括号,ios,objective-c,Ios,Objective C,我正在Lynda.com上为objective-c做一个教程,并运行了这个示例代码。这是ViewController.m文件的一部分。这个练习背后的想法是创建一个包含自定义元素的选择器对象。 下面的代码工作得很好,并为我提供了一个带有“happy”和“sad”选项的选择器: @implementation ViewController -(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{ ret

我正在Lynda.com上为objective-c做一个教程,并运行了这个示例代码。这是ViewController.m文件的一部分。这个练习背后的想法是创建一个包含自定义元素的选择器对象。 下面的代码工作得很好,并为我提供了一个带有“happy”和“sad”选项的选择器:

  @implementation ViewController

-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
    return 1;
}

-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
    return [[self moods] count];
}

-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
    return self.moods[row];
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.



    self.moods = @[@"happy",@"sad"];
}
然而,我更喜欢方括号而不是点语法,正如你们所看到的,我在几个不同的地方用它做了实验。
return[[self.moods]count
在教程中被写成
return[self.moods count]
,但我想用方括号来验证它是否仍然有效,并且我了解发生了什么,所以我对它进行了更改,效果很好。不过,我一直在尝试对
self.moods=@[@“happy”@“悲伤”];
因为我不喜欢它的样子。我试过:

[[self moods] initWithObjects: @"happy",@"sad", nil];

但是我得到了一个空白的选取器和一个警告“expression result unused”。我试着把
\u moods=
放在那个表达式之前,但仍然得到了一个空白的选取器。这里怎么了?

这个
[自我情绪]
引用它的方式只能在表达式的右侧使用,它调用属性的getter。
self.moods=…
实际上是
[self-setMoods:…]的语法糖。


因此,请尝试
[self-setMoods:@[@“happy”,“@“sad”]]
引用它的
[self-moods]
方法只能在表达式的右侧使用,它调用属性的getter。
self.moods=…
实际上是
[self-setMoods:…]的语法糖。


因此,请尝试
[self-setMoods:@[@“happy”和@“sad”]

了解@property声明以及它如何“合成”getter和setter方法。您要做的是“设置”moods属性:

[self setMoods: @[@"happy",@"sad"]];

您需要阅读@property声明以及它如何“合成”getter和setter方法。您需要做的是“设置”moods属性:

[self setMoods: @[@"happy",@"sad"]];

我假设您在接口中声明了
@property(强,非原子)NSArray*moods;
,因为
self.moods
可以工作

Setter和getter方法
setMoods
getMoods
是自动创建的

下面是dot语法如何归结为

// These are equivalent
self.moods = @[@"happy",@"sad"];
[self setMoods:@[@"happy",@"sad"]]; // Literal declaration
[self setMoods:[[NSArray alloc] initWithObjects:@"happy",@"sad",nil]]; // Full declaration
这是因为您使用的是声明NSArray*的“文字”方式,其中包括“分配”和“初始化”

-(instancetype)initWithObjects:
是一种实例方法,应该对已使用
alloc
分配的实例变量调用它。您试图初始化一个从未在内存中分配过的变量

一个稍微清洁的替代方案是:

[self setMoods:[NSArray arrayWithObjects:@"happy",@"sad",nil]];

arrayWithObjects:
包括分配和初始化。

我假设您在界面中声明了
@property(强,非原子)NSArray*moods;
,因为
self.moods
可以工作

Setter和getter方法
setMoods
getMoods
是自动创建的

下面是dot语法如何归结为

// These are equivalent
self.moods = @[@"happy",@"sad"];
[self setMoods:@[@"happy",@"sad"]]; // Literal declaration
[self setMoods:[[NSArray alloc] initWithObjects:@"happy",@"sad",nil]]; // Full declaration
这是因为您使用的是声明NSArray*的“文字”方式,其中包括“分配”和“初始化”

-(instancetype)initWithObjects:
是一种实例方法,应该对已使用
alloc
分配的实例变量调用它。您试图初始化一个从未在内存中分配过的变量

一个稍微清洁的替代方案是:

[self setMoods:[NSArray arrayWithObjects:@"happy",@"sad",nil]];

arrayWithObjects:
包括分配和初始化。

之所以
[[self moods]initWithObjects:@“happy”、@“sad”,nil];
没有达到您预期的效果,是因为对点语法以及它与使用方括号发送消息的关系存在误解

点语法是“语法糖”,也是访问类属性的推荐方法,例如您问题中的
mood
属性。点语法只是Objective-C中访问器(setter/getter)的简写。一个简单的示例可能有助于澄清这一点

当点语法发现自己位于赋值运算符的右侧或作为消息的接收者时,将调用getter方法

// These two are equivalent
NSArray *allMoods = self.moods
NSArray *allMoods = [self moods]

// These two are equivalent
NSUInteger count = [self.moods count];
NSUInteger count = [[self moods] count];
// These two are equivalent
self.moods = @[@"happy", @"sad"];
[self setMoods:@[@"happy", @"sad"];
当点语法位于赋值运算符的左侧时,将调用setter方法

// These two are equivalent
NSArray *allMoods = self.moods
NSArray *allMoods = [self moods]

// These two are equivalent
NSUInteger count = [self.moods count];
NSUInteger count = [[self moods] count];
// These two are equivalent
self.moods = @[@"happy", @"sad"];
[self setMoods:@[@"happy", @"sad"];
使用点语法不仅是一个很好的速记,它还使您的意图更加清晰,代码的新手立即意识到
情绪是类的属性

另外,
[[self moods]initWithObjects:@“happy”,“sad”,nil];
无效的原因是因为
-initWithObjects:
NSArray
的初始值设定项,应该在
+alloc
之后立即调用
正在返回一个已存在的
NSArray
,或者正在延迟实例化一个。为完整起见,应按如下方式使用
-initWithObjects

NSArray *myArray = [[NSArray alloc] initWithObjects:@"happy", @"sad", nil];

[[self moods]initWithObjects:@“happy”@“sad”,nil];
之所以没有达到预期效果,是因为对点语法的理解以及它与使用方括号发送消息的关系产生了误解

点语法是“语法糖”,也是访问类属性的推荐方法,例如您问题中的
mood
属性。点语法只是Objective-C中访问器(setter/getter)的简写。一个简单的示例可能有助于澄清这一点

当点语法发现自己位于赋值运算符的右侧或作为消息的接收者时,将调用getter方法

// These two are equivalent
NSArray *allMoods = self.moods
NSArray *allMoods = [self moods]

// These two are equivalent
NSUInteger count = [self.moods count];
NSUInteger count = [[self moods] count];
// These two are equivalent
self.moods = @[@"happy", @"sad"];
[self setMoods:@[@"happy", @"sad"];
当点语法位于赋值运算符的左侧时,将调用setter方法

// These two are equivalent
NSArray *allMoods = self.moods
NSArray *allMoods = [self moods]

// These two are equivalent
NSUInteger count = [self.moods count];
NSUInteger count = [[self moods] count];
// These two are equivalent
self.moods = @[@"happy", @"sad"];
[self setMoods:@[@"happy", @"sad"];
使用点语法不仅是一种很好的速记方法,而且还可以使