帮助我理解为什么:[self propertyName] 有效,而属性名称不起作用



所以我有一个定义了属性的类-为了这个例子,我们称之为propertyName。在我的实现中,我使用@synthesize设置了属性。

我有一个叫做objectToNSDictionary的方法,它将属性转储到一个字典中:

NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:
                      [self propertyName], @"propertyName", nil];

我返回字典调用者,我使用JSonWriter将其转换为字符串,并将其传递给一些服务…

只要说以上是可行的就够了。但是,我最初的实现没有使用[self propertyName],而是使用propertyName。当我这样做的时候,当我试图在调用者中使用对象时,我总是有一个错误说unrecognized selector sent to instance

语法的真正区别是什么?为什么一种有效而另一种不起作用?

当您使用[self propertyName]时,您正在通过合成getter方法引用您为类定义的属性。当您直接使用propertyName时,您将绕过该属性并直接使用类ivar。只要ivar 确实是propertyName,这就可以工作,这不是必需的,也可能不是这种情况。一般来说,直接访问你的ivar是一个坏主意,因为这样做会绕过编译器为你生成的内存管理脚手架。

你需要从你的调用类发布相关的代码,能够告诉为什么你得到一个'选择器不被识别'的消息。

最新更新