可能重复:
How do I declare class-level properties in Objective-C?
Objective-C 2.0 dot notation - Class methods?
Objective-C的@property声明不允许您指定类级属性。例如,你不能这样做......
@interface NSObject (MyExtension)
+ @property (nonatomic, copy) NSString * className;
@end
...但我记得读过属性实际上只是获取/设置消息的语法糖,所以当你输入something.foo时,你真的只是发送[某事foo]或[某事setFoo:newFooVal ]消息。
所以我有了一个想法,并写了这个普通的班级成员......
@interface NSObject (MyExtension)
+ (NSString *) className;
@end
并在'm'文件中添加了这个(再次,完全正常)......
#import "IS_NSObject.h"
@implementation NSObject (MyExtension)
+ (NSString *) className
{
return NSStringFromClass([self class]);
}
@end
...当然,要获得任何类名的字符串表示,我现在可以这样做......
NSString * holderForClassName = UICollectionView.className;
瞧!一个级别的属性!甚至没有编译器警告!
实际上,唯一缺少的是代码完成/智能感知中的建议。但是当然如果你这样打字就行了......
NSString * holderForClassName = [UICollectionView className];
当然,问题是......我基本上只是'发现'(即它总是在那里,但它没有像这样使用)一个类级别的属性?
(好吧,好的,属性语法,但这就是我追求链接的目的,而不是嵌套大量的括号。)
答案 0 :(得分:3)
您正在描述一直使用该语言的功能。
正如你所提到的,属性只是getter方法和setter方法的语法糖。
@property和@synthesize只是帮助你实现属性,它们编译成与你自己实现getter和setter时相同的东西。
换句话说,在您的发现中没有任何新的或意外的,抱歉。但类级属性有时会有所帮助,尽管我认为一些(大多数?)ObjC编码指南建议使用消息语法调用类级别的getter。这可能也就是为什么当你使用虚线表示法时它不会出现在intellisense中。