NSUerDefault setValue 和setObject

本文讨论了在iOS开发中使用NSUserDefault时setValue与setObject的区别。当使用setValue将值设为nil时,可能会导致对应键值被删除的问题,尤其是在较老的iOS版本中更为常见。因此建议开发者在设置nil值时采用setObject方法以避免意外的数据丢失。

这两种都是可以的,但是 如果你在某个地方对同一个key
setValue:nil for:Key 那就会把 NSUserDefault中的这个key给清除掉,(比较老的版本会出现概率大),所以尽量 用setObject 比较保险

在 Android Kotlin 中,`setValue` `getValue` 方法通常用于属性委托机制,结合 `thisObj: Any?` `property: KProperty<*>` 参数,以下是不同场景下的具体实现示例。 ### 自定义委托类实现 首先创建一个自定义委托类,实现 `ReadWriteProperty` 接口,并重写 `getValue` `setValue` 方法: ```kotlin import kotlin.reflect.KProperty class CustomDelegate<T> : ReadWriteProperty<Any?, T> { private var value: T? = null override fun getValue(thisObj: Any?, property: KProperty<*>): T { return value as T } override fun setValue(thisObj: Any?, property: KProperty<*>, value: T) { this.value = value } } ``` 使用这个自定义委托类: ```kotlin class MyClass { var myProperty: String by CustomDelegate() } fun main() { val obj = MyClass() // 调用 setValue 方法 obj.myProperty = "Hello, World!" // 调用 getValue 方法 val value = obj.myProperty println(value) } ``` ### 结合 Android 视图绑定示例 在 Android 开发中,结合视图绑定可以实现更实际的应用。假设在一个 `Activity` 中使用委托来管理视图绑定: ```kotlin import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.viewbinding.ViewBinding import kotlin.reflect.KProperty class ViewBindingDelegate<T : ViewBinding>( private val bindingFactory: (Any) -> T ) : ReadWriteProperty<AppCompatActivity, T> { private var binding: T? = null override fun getValue(thisObj: AppCompatActivity, property: KProperty<*>): T { return binding ?: bindingFactory(thisObj).also { binding = it thisObj.setContentView(it.root) } } override fun setValue(thisObj: AppCompatActivity, property: KProperty<*>, value: T) { binding = value } } ``` 在 `Activity` 中使用这个委托: ```kotlin import androidx.appcompat.app.AppCompatActivity import com.example.myapp.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { private val binding: ActivityMainBinding by ViewBindingDelegate { ActivityMainBinding.inflate(layoutInflater) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 自动调用 getValue 方法 binding.textView.text = "Hello, Android!" } } ``` ### 系统自带的 State 类示例 在 Jetpack Compose 中,`State` `MutableState` 类也使用了 `setValue` `getValue` 方法: ```kotlin import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue fun example() { var count by mutableStateOf(0) // 调用 setValue 方法 count = 1 // 调用 getValue 方法 val currentCount = count println(currentCount) } ``` `mutableStateOf` 的 `setValue` `getValue` 实现如下: ```kotlin inline operator fun <T> MutableState<T>.setValue(thisObj: Any?, property: KProperty<*>, value: T) { this.value = value } inline operator fun <T> State<T>.getValue(thisObj: Any?, property: KProperty<*>): T = value ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值