这是在Objective-C中创建类级属性(即点语法)的有效方法吗?

时间:2013-01-19 10:09:41

标签: objective-c properties class-members

  

可能重复:
  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];

当然,问题是......我基本上只是'发现'(即它总是在那里,但它没有像这样使用)一个类级别的属性?

(好吧,好的,属性语法,但这就是我追求链接的目的,而不是嵌套大量的括号。)

1 个答案:

答案 0 :(得分:3)

您正在描述一直使用该语言的功能。

正如你所提到的,属性只是getter方法和setter方法的语法糖。

@property和@synthesize只是帮助你实现属性,它们编译成与你自己实现getter和setter时相同的东西。

换句话说,在您的发现中没有任何新的或意外的,抱歉。但类级属性有时会有所帮助,尽管我认为一些(大多数?)ObjC编码指南建议使用消息语法调用类级别的getter。这可能也就是为什么当你使用虚线表示法时它不会出现在intellisense中。