奇怪的Objective-C错误,属性不区分大小写?

7

我有两个属性"M"和"m",虽然不是最好的编码风格,但请见谅。在init方法中对这些属性的赋值无法正常工作。以下是完整的代码:

#import "AppDelegate.h"

@interface Foo : NSObject
@property (nonatomic, assign) int M;
@property (nonatomic, assign) int m;
- (id)initWithM:(int)M m:(int)m;
@end

@implementation Foo

- (id)initWithM:(int)M m:(int)m {
    if((self = [super init])) {
        self.M = M;
        printf("M = %d %d\n", M, self.M);
        self.m = m;
        printf("M = %d %d\n", M, self.M);
        printf("m = %d %d\n", m, self.m);
    }
    return self;
}
@end

@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
    Foo *f = [[Foo alloc] initWithM:2 m:1];
}
@end

下面是printf函数的输出:

M = 2 2
M = 2 1
m = 1 0

如果我将“M”改为“BAR”,将“m”改为“bar”,那么它的工作方式就符合我的期望。除了编译器错误之外,还有其他解释吗?
谢谢。

1
你使用的Xcode版本是哪个?你的代码在Xcode 4.6中无法编译。main.m:21:9: 合成属性'M'和'm'都声明了setter 'setM:' - 使用此setter将导致意外行为 - Sebastian
1
Xcode 4.4.1。我猜他们在我的版本之后发现了这个问题。 - Charlie Burns
1
@CharlieBurns 你错过了这个网站。在 Meta 上,因为不同意而投反对票是可以接受的,但在 SO 上不行(去读一下 FAQ)。如果你不同意,可以留下评论或添加另一个答案来解释你认为应该做什么。你只有在答案技术上错误(它肯定不是)或者是垃圾邮件(也不是)时才应该投反对票。 - user529758
@CharlieBurns 谢谢。我建议我们清理掉所有这些评论。 - user529758
1个回答

12
@property int M;
@property int m;

两者都创造

- (void)setM:(int)

如果你真的想同时拥有mM属性(这绝对是不应该的),你可以使用

@property int M;
@property (setter = setLowerCaseM:, getter = lowerCaseM)int m;

是的,这解释清楚了。谢谢。 - Charlie Burns
在这种情况下,你确定它们都使用相同的getter吗? - Firo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接