我有一个具有一些属性的类,其中一些必须是只读的,否则它们可能会导致系统问题。
一个例子如下:
Button.h
@property (nonatomic, strong, readonly) NSString *button_id;
我遇到的问题是我要将代码作为静态库提供,但我不希望有人能够更改标头代码并允许变量可写。
如您所见,我对目标C没有太多了解,避免这种情况的最佳策略是什么?
我有一个具有一些属性的类,其中一些必须是只读的,否则它们可能会导致系统问题。
一个例子如下:
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"; }