属性在静态库上是只读的

问题描述

我有一个包含一些属性的类,其中一些必须是只读的,否则可能会导致系统问题。

示例如下:

Button.h

@property (nonatomic,strong,readonly) Nsstring *button_id;

我遇到的问题是我要将代码作为静态库交付, 但我不希望有人能够更改标题代码并允许该变量可写。

如您所见,我对目标 C 不太了解,避免此类情况的最佳策略是什么?

解决方法

在 Objective-C 中,您可以轻松绕过 readonly 注释,并且一般同意其他人不会以这种方式弄乱代码,除非他想......

我要说的是,您应该像现在一样将其标记为 readonly,不要太担心。如果您正在处理一些确实不应更改的敏感内容,则需要使用例如加密但至少下面是一种使其比readonly更强大的方法。

下面的代码不依赖于属性,而是依赖于类方法。您也可以使用实例方法,但这里的类更有意义。这会立即导致它不可设置,因此您可以避免很多人可能有意或无意设置它的情况。您还可以将其从头文件中取出并牢固地放入(已编译的)类文件中。

direct 属性进一步意味着它不能在子类中被覆盖。这是最好的。对于 UI 中的按钮 ID 来说,这完全是矫枉过正,对于例如一个银行账户,但要尽可能地强大。

头文件/接口

+ ( NSString * ) password __attribute__ ( ( objc_direct ) );

实施

+ ( NSString * ) password __attribute__ ( ( objc_direct ) )
{
    return @"abc";
}

使用

NSLog ( @"The password is %@",MyClass.password );

编辑

FWIW 如果您只想拥有一堆只读 ID,只需在标题中使用类似下面的内容

+ ( NSString * ) id1;
+ ( NSString * ) id2;

并像这样实现它

+ ( NSString * ) id1 { return @"1"; }
+ ( NSString * ) id2 { return @"2"; }