Objective c 属性在静态库上为只读

Objective c 属性在静态库上为只读,objective-c,header,static-libraries,readonly-attribute,Objective C,Header,Static Libraries,Readonly Attribute,我有一个具有一些属性的类,其中一些属性必须是只读的,否则可能会导致系统问题 例如: Button.h @property (nonatomic, strong, readonly) NSString *button_id; 我的问题是,我将以静态库的形式交付代码, 但我不希望有人能够更改头代码并允许变量可写 正如你所看到的,我不太清楚​​在Objective-C中,你可以很容易地绕过只读注释,一般认为其他人不会以这种方式干扰代码,除非他想 我想说的是,您应该像现在一样将其标记为只读,不要太担

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

例如:

Button.h

@property (nonatomic, strong, readonly) NSString *button_id;
我的问题是,我将以静态库的形式交付代码, 但我不希望有人能够更改头代码并允许变量可写


正如你所看到的,我不太清楚​​在Objective-C中,你可以很容易地绕过
只读注释,一般认为其他人不会以这种方式干扰代码,除非他想

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

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

direct
属性进一步意味着它不能在子类中被重写。这是最好的了。对于用户界面中的按钮ID来说,这是完全的过度使用,对于银行帐户来说,这是不够的,但它的强度是你所能做到的

头文件/接口

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

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

编辑

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

+ ( NSString * ) id1;
+ ( NSString * ) id2;
然后像这样实现它

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