Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 方法和属性的名称相同_Objective C_Cocoa_Properties - Fatal编程技术网

Objective c 方法和属性的名称相同

Objective c 方法和属性的名称相同,objective-c,cocoa,properties,Objective C,Cocoa,Properties,下面的代码编译得很好,但是有什么问题吗? 我找不到任何有关Objective-C的指导原则来阻止我们对属性和方法名称使用相同的标识符: @interface MouseCursorHelper : NSObject @property (nonatomic, readwrite, retain) NSCursor* rotateCursor; + (NSCursor*) rotateCursor; @end FWIW,该类被实现为一个以NSCursor为模型的单例,以提供特定于应用程序的

下面的代码编译得很好,但是有什么问题吗?
我找不到任何有关Objective-C的指导原则来阻止我们对属性和方法名称使用相同的标识符:

@interface MouseCursorHelper : NSObject

@property (nonatomic, readwrite, retain) NSCursor* rotateCursor;

+ (NSCursor*) rotateCursor;

@end

FWIW,该类被实现为一个以NSCursor为模型的单例,以提供特定于应用程序的游标。

这可能有点令人困惑

该属性为您生成2个实例方法:

- (NSCursor *)rotateCursor;
- (void)setRotateCursor:(NSCursor *)rotateCursor;
还有一个类方法:


从用户的角度来看,类方法的作用并不明确。文档将有所帮助。

您在那里所做的绝对没有问题。您所做的只是说明类对象和类实例都响应
rotateCursor
。这与响应intValue的NSString实例和响应intValue的NSNumber实例在概念上并没有什么不同。它们只是不同种类的物体

事实上,你会发现苹果公司在Cocoa框架中也做了同样的事情

[NSString class]; // Sending class to the class
[@"foo" class];   // Sending class to an instance of the class.

嗯,对。Obj-C对于同名的实例和类方法没有问题吗?该属性实际上是在实现文件中定义的,但在Obj-C中缺乏适当的可见性支持。类的用户仍然可以访问该属性。类和实例方法之间没有歧义,因为它们以不同的方式调用(类对象/实例)。它可以在运行时访问,也可以通过KVC访问,或者作为
id
上的方法调用访问,但是编译器在某些情况下应该会抱怨…好的。我想我总是可以将属性重命名为一些愚蠢的东西,比如
rotateCursorInstance
,以消除该级别上的歧义/混乱。我将更多地考虑使用类方法实现什么。为什么它不是一个实例方法?您的类是单例的吗?是的,它类似于NSCursor以NSCursor提供的相同方式添加更多项目特定的游标(通过类方法a la
+arrowCursor
。单例只分配/加载一次游标。
[NSString class]; // Sending class to the class
[@"foo" class];   // Sending class to an instance of the class.