首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么NSUserDefaults返回一个解除分配的字符串?(更新#2)

为什么NSUserDefaults返回一个解除分配的字符串?

NSUserDefaults是苹果提供的一个简单的数据存储和读取的工具,它可以用来存储应用程序的配置信息和用户设置。当我们尝试从NSUserDefaults中读取一个字符串时,有时会发现返回的是一个解除分配的字符串,这是什么原因呢?

解除分配的字符串通常是指一个已经被释放的内存地址,这可能是由于内存管理的问题导致的。在Objective-C中,字符串是通过引用计数来管理内存的,当一个字符串被创建时,它的引用计数为1,当它被其他对象引用时,引用计数会增加,当引用计数减少到0时,字符串会被释放。如果在读取NSUserDefaults时,字符串的引用计数已经减少到0,那么就会出现解除分配的字符串。

为了解决这个问题,我们需要确保在读取NSUserDefaults时,字符串的引用计数不会减少到0。可以通过以下方法来实现:

  1. 使用copy方法来创建一个新的字符串,这样即使原始字符串被释放,新的字符串仍然可以正常使用。
代码语言:txt
复制
NSString *str = [[NSUserDefaults standardUserDefaults] stringForKey:@"myKey"].copy;
  1. 使用stringWithString:方法来创建一个新的字符串,这个方法会自动增加字符串的引用计数。
代码语言:txt
复制
NSString *str = [NSString stringWithString:[[NSUserDefaults standardUserDefaults] stringForKey:@"myKey"]];

总之,解除分配的字符串是由于内存管理问题导致的,我们需要确保在读取NSUserDefaults时,字符串的引用计数不会减少到0,以避免出现这个问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

2021-09-16:给定一个仅包含数字 2-9 字符串返回所有

2021-09-16:给定一个仅包含数字 2-9 字符串返回所有它能表示字母组合。答案可以按 任意顺序 返回。给出数字到字母映射如下(与电话按键相同)。注意 1 不对应任何字母。...按键2对应:'a', 'b', 'c'。按键3对应:'d', 'e', 'f'。按键4对应:'g', 'h', 'i'。按键5对应:'j', 'k', 'l'。按键6对应:'m', 'n', 'o'。...示例 2:输入:digits = "",输出:[]。示例 3:输入:digits = "2",输出:"a","b","c"。 福大大 答案2021-09-16: 自然智慧。递归。...letterCombinations(digits) fmt.Println(ret) } var phone = [][]byte{ {'a', 'b', 'c'}, // 2...0 {'d', 'e', 'f'}, // 3 1 {'g', 'h', 'i'}, // 4 2 {'j', 'k', 'l'}, /

1.3K10
  • iOS 每天某些时间点做某些事情

    开篇 我们项目启动时候要弹出一个广告窗口,很简单一个功能,服务器判断一下满足条件,即返回数据,客户端判断数据部位NULL,则弹出弹窗 但是老板说,这个要时间短弹出,每天中午12点到下午2点不能弹出来...这这这,有点坑我们吧,每天存一个key,有点坑吧 仔细想想,没有必要啊,这就是考验我们对时间操作,代码实现如下: 代码实现 #pragma mark -- 判断是否弹出广告 - (BOOL)...,则返回YES } return NO; } return NO; } 里面注释写很清楚了吧,我可能代码里面有个类目,代码如下: 获取当前天数时间几点几分时间戳...[GDDateUtil stringFromDateSetDateFormat:xxx] /** * 获取时间,并转换为字符串 * * @return return 返回字符串 */...,此处使用formater格式要与字符串格式完全一致,否则转换失败 NSString *dateStr = [formater stringFromDate:date];//将日期转换成字符串

    79460

    2021-09-16:给定一个仅包含数字 2-9 字符串返回所有它能表示字母组合。答案可以按 任意顺序 返回。给出数字到字

    2021-09-16:给定一个仅包含数字 2-9 字符串返回所有它能表示字母组合。答案可以按 任意顺序 返回。给出数字到字母映射如下(与电话按键相同)。注意 1 不对应任何字母。...按键2对应:'a', 'b', 'c'。按键3对应:'d', 'e', 'f'。按键4对应:'g', 'h', 'i'。按键5对应:'j', 'k', 'l'。按键6对应:'m', 'n', 'o'。...示例 2:输入:digits = "",输出:[]。示例 3:输入:digits = "2",输出:["a","b","c"]。 福大大 答案2021-09-16: 自然智慧。递归。...letterCombinations(digits) fmt.Println(ret) } var phone = [][]byte{ {'a', 'b', 'c'}, // 2...0 {'d', 'e', 'f'}, // 3 1 {'g', 'h', 'i'}, // 4 2 {'j', 'k', 'l'}, /

    1.4K20

    iOS微信第三方登录实现

    在进行微信OAuth2.0授权登录接入之前,在微信开放平台注册开发者帐号,并拥有一个已审核通过移动应用,并获得相应AppID和AppSecret,申请微信登录且通过审核后,可开始接入流程。...若access_token已超时,那么进行refresh_token会获取一个access_token,新超时时间; 2....,使用逗号(,)分隔 "unionid":"o6_bmasdasdsad6_2sgVt7hMZOPfL" // 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段 } 错误返回样例: {"errcode...], "unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL" } 返回错误Json事例 { "errcode":40003,"errmsg":"invalid...openid" } 11、最后 做到上面一步就应该得到返回微信基本信息,然后根据你公司后台基本需求去实现授权后如何登录App.

    2.4K40

    iOS小技能:APP内本地化语言切换(案例:登录界面切换中英文)

    前言 原理: 从指定表和包中返回字符串本地化版本: NSLocalizedStringFromTableInBundle(key, table, _bundle, nil) 切换语言生效方式:采用销毁根控制器...或者 找不到key对应值,NSLocalizedString将直接返回key这个字符串 重置TableBundle - (void)resetBundle{ NSLog(@"resetBundle.../article/details/108793150 原理:在%和@中间加上数值 (1 ,2$),数字代表参数顺序 "FORMAT" = "I am %2$@ from '%1$@'"; II 自定义解析本地化字符串工具类...解决方案 新增一个table来存储,解析时候从两个文件查找。...对于在中英文语法区别,在本地化字符串时候,我们常常需要调整stringWithFormat参数顺序 原理:在%和@中间加上数值(1,2$),数字代表参数顺序 文章:https://blog.csdn.net

    3.1K20

    IOS开发问题索引(七)

    reverse指定该转换是否必须是可逆向转换。如果转换成功就返回true,否则返回false。...2.另外一个获取Xcode中,项目里resource文件夹下资源文件方法是: NSString* outputStr = [[NSBundlemainBundle] pathForResource...所以使用1中方法就可以了,得到路径后再通过appendString或者appendFormat来添加文件名字符串,就得到了resource下面的路径字符串,然后就可以在resource下面创建一个文件来储存数据...比如存入再读出一个字符串NSUserDefaults: NSString *string = [NSString stringWithString @"hahaha"]; NSUserDefaults...如果把一个自定义类存到一个NSArray里,然后再存到NSUserDefaults里也是不能成功。不信可以试试,如果你成功请告诉我。 那怎么办呢?

    1.1K40

    实现iOS图片等资源文件更新化(四): 一个最小化补丁更新逻辑

    简介 以前写过一个补丁更新文章,此处会做一个更精简最小化实现,以便于集成.为了使逻辑具有通用性,将剥离对AFNetworking和ReativeCocoa依赖....从简原因有3: 补丁更新,状态可以设计很复杂,就像开头那篇文章提到那样,但是我感觉没多大必要,至少在我们App中; 我想演示一个相对完整逻辑,但是又不想耗费太多时间构建场景; 从简后方案,...基本思路 App启动时,判断特定服务器接口所返回图片url是否为最新,判断方式就是比对返回值中md5字段与本地保存资源url是否一致; 如果图片资源有更新,则下载解压到指定缓存目录,初步打算以资源文件...2. 如何校验下载文件md5值,如果你需要的话? 开头那篇文章链接里,有提到.核心,其实是在于下载文件之后,md5值计算,剩余就是字符串比较操作了....建议是在下载并解压资源文件到指定缓存目录后,再更新补丁相关缓存信息,因为这个信息,读取图片时,也是需要.如果删除某个补丁,按照目前设计,一种比较偷懒方案就是,在服务器上放上一个空资源文件就可以了

    1.1K50

    GB代码规范1.0

    Interface写法 写法模板 @interface 类名 : 父类 @interface和类名中间一个空格 类名后紧跟:之后空格加上父类协议之间用,空格分割 建议写法...类需要声明更新购物车列表通知 kCVMNoticationUpdateCartList 如果是声明Cell重用字符 k+cell名称+identifier 比如: GBHomeItemTableViewCell...不建议写法 if(YES) { doing something } 计算符号两边要有空格 比如 + - * / =等运算符左右有空格 建议写法 x = 1 + 2; 不建议写法 x=1+2;...)(void) 错误写法 typedef void(DidUpdateViewCallBack) 使用NSUserDefaults要先创建 因为我们用到NSUserDefaults无非是保存和读取 事先创建一个对象...object : [self createObject]; 错误处理 有些方法通通过参数返回 error 引用,使用这样方法时应当检查方法返回值,而非 error 引用。

    1.2K20

    【IOS开发基础系列】数据持久化专题

    SQLite嵌入到使用它应用程序中,它们共用相同进程空间,而不是单独一个进程。从外部看,它并不像一个RDBMS,但在进程内部,它却是完整,自包含数据库引擎。...字符串转换为C字符串,&db是sqlite3指针(* db)地址。         ...= SQLITE_OK         sqlite3_exec是执行任何不带返回值sql语句,第2个参数是要执行sql语句,第3个参数是要回调函数,第4个参数是要回调函数参数,第5个参数是执行出错字符串...NSAssert1是带有一个参数NSAssert函数,此外还有NSAssert2等函数。         有参数SQLite3处理过程:     1、打开数据库sqlite3_open。     ...第5个参数为一个函数指针,SQLITE3执行完操作后回调此函数,通常用于释放字符串占用内存。         sqlite3_step(statement) !

    25020

    MMKV--基于 mmap iOS 高性能通用 key-value 组件

    这就需要一个性能非常高通用 key-value 存储组件,我们考察了 NSUserDefaults、SQLite 等常见组件,发现都没能满足如此苛刻性能要求。...考虑到主要使用场景是频繁地进行写入更新,我们需要有增量更新能力:将增量 kv 对象序列化后,直接 append 到内存末尾;这样同一个 key 会有新旧若干份数据,最新数据在最后;那么只需在程序启动第一次打开...空间增长 使用 append 实现增量更新带来了一个问题,就是不断 append 的话,文件大小会增长得不可控。...例如同一个 key 不断更新的话,是可能耗尽几百 M 甚至上 G 空间,而事实上整个 kv 文件就这一个 key,不到 1k 空间就存得下。这明显是不可取。...另外,在测试中发现,NSUserDefaults 在每2-3次测试,就会有1次比较耗时操作,怀疑是触发了数据 synchronize 重整写入。

    8.2K211

    iOS存储自定义类型到NSUserDefaults数据库

    存储自定义类型对象到NSUserDefaults 3.1 基本用法 3.2 例子:创建一个处理数据库工具类 3.3 数据库缓存性能进行优化 3.4 测试验证 前言 一般通过以下两种方式使用磁盘缓存:...I 沙盒 我们都知道,iOS系统为了保证系统安全性,采用了沙盒机制(即每个应用程序都会有自己一个独立存储空间)。 其原理是通过重定向技术,把应用程序生成和修改文件重定向到自身文件夹中。...表示搜索Library 如果expandTilde参数为NO,即不展开路径,则返回路径如下: ~/Documents 获取tmp目录路径需要使用NSTemporaryDirectory函数。...获取tmp文件夹路径方法如下: NSString *path = NSTemporaryDirectory(); 在模拟器上,返回路径示例: /Users/wangzhuozhou/Library...文件缓存 使用文件缓存数据,实现起来相对比较简单, 可以使用NSKeyedArchiver类将字典对象进行归档并写入文件,也可以使用NSJSONSerialization类把字典对象转换成JSON格式字符串写入文件

    97710

    从底层分析一下存在跨进程通信问题 NSUserDefaults 还能用吗?

    随之而来问题就是:NSUserDefaults 还能用吗? 经过对底层分析后,笔者研究结论是:可以在理解 NSUserDefaults 特性后再使用。...NSUserDefaults 是 iOS 开发者常用持久化工具,通常用于存储少量数据 示例: NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults...image 随后,会通过 xpc_connection_send_message_with_reply_sync 发送一个信息 ?...image [defaults setObject:@"酷酷哀殿1" forKey:@"key"]; 执行时,同样会发送一个消息 ?...image 五、总结 本文通过分析 NSUserDefaults 3 个特性:1、多线程安全,2、内存级别缓存,3、写操作会触发 xpc 通信;可以得到以下结论: 只有在以下场景才适合选择 NSUserDefaults

    2.4K31

    一文带你解读​JavaScript中变量、作用域和内存问题

    = 'nick' console.log(obj2.name) console.log(obj2 == obj1) 图示: 我们变量名obj1储存一个对象引用,它指向堆里面的一个对象(object...由于调度垃圾回收程序方面的问题会导致性能下降,它策略是根据分配数,比如分配了 256 个变量、4096 个对象/数组字面量和数组槽位(slot),或者 64KB 字符串。...这样实现问题在于,分配那么多变量脚本,很可能在其整个生命周期内始终需要那么多变量,结果就会导致垃圾回收程序过于频繁地运行。 由于对性能严重影响,IE7最终更新了垃圾回收程序。...这么一个简单修改,极大地提升了重度依赖 JavaScript 网页在浏览器中性能。 3.3 管理内存 为什么需要管理内存?...但 globalPerson 是一个全局变量,应该在不再需要时手动解除其引用,最后一行就是这么做。不过要注意,解除一个引用并不会自动导致相关内存被回收。

    55330

    编码篇-持久化NSUserDefaults

    Attempt to insert non-property list object 报错原因, 从NSUserDefaults返回值是不可改变,即便是你在存储时候使用是可变值。...NSUserDefaults是单例,同时也是线程安全 NSUserDefaults 使用 简便方法存取不同类型数据 由上边例子可以看到一个方法-setInteger:,这跟常用-setObject...{@"color":@"blue"}]; 这时NSUserDefaults里面'color'=='blue'; 2.如果你在app中又重新设置了'color'=='red'; 3.这时你重新运行一下你...此时依然是'color'=='red'; 储存自定义对象 使用归档存储(真的储存) 一个NSUserDefaults对象必须是属性表,这也就是说我们可以存储NSData,NSString,NSNUmber...如果你想存储其他类型对象,我们可以将其归档并创建一个NSData来实现存储。

    1.2K10

    iOS IAP应用内购详细步骤和问题总结指南

    服务器返回包含产品标识符列表。 程序向App Store发送请求,得到产品信息。 App Store返回产品信息。...服务器读取返回数据,确定用户购买内容。 服务器将购买内容传递给程序。...2.Appstore向客户端返回一段receipt-data,里面记录了本次交易证书和签名信息。...进行验证 6.itunes.appstore返回验证结果给服务器 7.服务器对商品购买状态以及商品类型,向客户端发放相应道具与推送数据更新通知 漏单处理 确保receipt-data成功提交与异常处理...**A:**先看一下官方文档怎么说生成收据验证代码 为了在验证自动续期订阅时提高您 App 与 Apple 服务器交易安全性,您可以在收据中包含一个 32 位随机生成字母数字字符串,作为共享密钥。

    9.4K12
    领券