我一直在关注iTunes U上的斯坦福大学iphone视频。看到老师试图做类似这段代码的事情,但他意识到并说它不起作用虽然我没理解:
- (IBAction)flashPressed{
if (window.backgroundColor == [UIColor magentaColor]){
window.backgroundColor = [UIColor redColor];
}else {
window.backgroundColor = [UIColor magentaColor];
}
}
Objective-C,基于Windows的应用程序。不确定你还需要知道什么。
答案 0 :(得分:5)
它不起作用的原因是UIView
的{{1}}是backgroundColor
属性。它的声明如下:
copy
这意味着当您从@property(nonatomic, copy) UIColor *backgroundColor;
获取的颜色对象设置为[UIColor redColor]
时,将复制整个对象,并且backgroundColor
保留的副本将位于不同于UIView
类对象保留的内存地址。
UIColor
检查指针是否相同,这意味着只有当两个指针指向同一个对象时它才会成功。这是你有时想做的事情。例如:
==
在这里,您要确保if ([aView superView] == self)
[aView removeFromSuperview];
的超级视图实际上是这个对象,而不仅仅是根据某些标准“相同”的对象。
但是当你比较两个字符串时,你(几乎总是)对它们是否包含相同的字符感兴趣,并且它们是否在不同的内存地址上并不重要。因此,您使用:
aView
在我们的颜色示例中,它是相同的:我们想知道这两个对象是否都代表红色,而不是两个指针是否指向完全相同的对象。
如果if ([aString isEqualToString:anotherString]) // faster than isEqual:
属性被声明为backgroundColor
,您可以使用retain
,并且在==
出于某种原因重新分配其UIColor
之前一直有效宾语。这不太可能发生,但是要强调的是,对象代表了一种独特的东西,像字符串和颜色这样的对象通常是redColor
而不是'保留'。只能有一种颜色为红色,并且只能有一个包含“Hello world!”字符的字符串。因此,最终归结为一种形而上学的论证。
答案 1 :(得分:3)
要检查两个UIColors是否相等,请使用isEqual:消息而不是 == 运算符。
if ([window.backgroundColor isEqual:[UIColor redColor]]) {
NSLog(@"Yup, it's red");
} else {
NSLog(@"OMG, it's not red!");
}
// result --> Yup, it's red
这是比较对象的一般模式,而不是像对整数(如整数或浮点数)那样使用 == 。 NSString的工作方式相同。
信息部分过多:
具有已定义顺序的对象的模式是为它们提供一个返回NSSortDescriptor的compare:方法。