iOS修改宣告為readonly的值

2021-09-12 01:30:52 字數 2137 閱讀 9678

首先定義乙個測試用的類test

test.h

#import

@inte***ce test : nsobject

@property (nonatomic, copy, readonly) nsstring *testname;

@property (nonatomic, assign, readonly) nsinteger testage;

- (instancetype)initwithtestname:(nsstring *)name testage:(nsinteger)age;

@end

複製**

test.m

#import "test.h"

@implementation test

- (instancetype)initwithtestname:(nsstring *)name testage:(nsinteger)age

return self;

}@end

複製**

然後定義乙個test的類物件:

test *test = [[test alloc] initwithtestname:@"testname"

testage:22];

nslog(@"%@",test.testname);

複製**

如果我們直接呼叫testname的setter方法,test.testname = @"修改了";會直接報錯。提示這個屬性是唯讀的。

如果我們使用kvc呢?

test *test = [[test alloc] initwithtestname:@"testname"

testage:22];

nslog(@"-%@",test.testname);

[test

setvalue:@"修改了"

forkey:@"testname"];

nslog(@"---%@",test.testname);

複製**

輸出結果:

2017-05-17 14:20:36.404 ios_readonlytest[4076:115282] -testname

2017-05-17 14:20:36.404 ios_readonlytest[4076:115282] ---修改了

複製**

我們看到,使用kvc成功修改了宣告為readonly的屬性。

如果我們不想讓setvalue:forkey:方法改變物件的屬性值,那麼重寫其類方法+ (bool)accessinstancevariablesdirectly返回 no (該方法預設返回 yes,即在不存在滿足條件的訪問方法時,允許直接訪問屬性對應的例項變數);在搜尋例項變數時,會首先檢查帶下劃線的例項變數,然後檢查不帶下劃線的例項變數。

重寫其類方法+ (bool)accessinstancevariablesdirectly返回 no的情況下,利用kvc修改宣告為readonly的屬性的值的時候會崩潰。我們可以重寫類的setvalue:forkey:方法,判斷key是否是宣告為readonly的屬性,如果是直接返回。

- (void)setvalue:(id)value forkey:(nsstring *)key

[super setvalue:value forkey:key];

}複製**

2017-05-17 14:29:35.894 ios_readonlytest[4108:118687] -testname

2017-05-17 14:29:35.894 ios_readonlytest[4108:118687] 這個屬性不能被修改

2017-05-17 14:29:35.895 ios_readonlytest[4108:118687] ---testname

複製**

iOS修改宣告為readonly的屬性值

本文討論的是,對於類中宣告為 readonly 的屬性值,我們就不可以修改其值了麼?如何可以,那麼如何修改呢?為了便於說明,定義乙個aclstudent的類 123 4567 891011 1213 1415 1617 1819 2021 2223 2425 2627 2829 3031 aclst...

iOS修改宣告為readonly的屬性值

本文討論的是,對於類中宣告為 readonly 的屬性值,我們就不可以修改其值了麼?如何可以,那麼如何修改呢?為了便於說明,定義乙個 aclstudent 的類 aclstudent.h inte ce aclstudent nsobject property nonatomic,assign,re...

定義為指標,宣告為陣列

檔案1中 定義指標 檔案2 宣告為陣列 char str abcd 在檔案1中 extern char str 在檔案2中 在檔案1中str這個變數裡面儲存了乙個字串的首位址假設是0x12345678 這個位址裡面存了a 後面的位址存放了b 依次類推 在檔案2中使用的時候會出現的問題 char c ...