3

可能重复:
如何在 Objective-C 中声明类级属性?
Objective-C 2.0 点表示法 - 类方法?

Objective-C 的 @property 声明不允许您指定类级别的属性。例如,你不能这样做......

@interface NSObject (MyExtension)

    + @property (nonatomic, copy) NSString * className;

@end

...但我记得读过属性实际上只是获取/设置消息的语法糖,所以当您键入 something.foo 时,您实际上只是发送 [something foo] 或 [something 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];

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

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

4

1 回答 1

3

您正在描述该语言中一直存在的功能。

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

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

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

于 2013-01-19T10:14:42.563 回答