iOS 释放内存/指针清空(release/=nil)深度讨论

(1)release/=nil,前后顺序是可以随便用。并且=nil是可以用无数次。

<wbr><wbr><wbr><wbr><wbr><wbr>事实: Object *object=[[Object alloc] init];</wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>[object release];</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>object=nil;</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>object=nil;</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>object=nil;</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>……</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>object=nil;//都不会报错。</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr>事实: Object *object=[[Object alloc] init];</wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>object=nil;</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>[object release];//也不会报错。</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>[object release];//也不会报错。</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>[object release];//也不会报错。</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>[object release];//也不会报错。</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>[object release];//也不会报错。</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>[object release];//也不会报错。*指针一定要为空,release才可以用无数次。</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

(2)两个指针指向同一个对象,其中一个指针清空(=nil),不影响另一个。如下两个图,比较可知:


(3)两个指针指向同一个对象,其中一个释放内存【即retainCount - 1】(release),影响另一个。如果引用到另一个指针的话会报错:


如果你开了:NSZombieEnabled,引用被释放的对象时,报错如下:*** -[objcect respondsToSelector:] message sent to deallocated instance 0x6a109f0

<wbr>(注意:containObject.delegate 的setter方法是assign)</wbr>

**************************************************************************************************

对比一:

①调用[objcet release]后,指针仍然指向内存块:0x6a109f0

②而调用object=nil(containObject.delegate=nil)后,指针不指向任何内存块,即内存地址:0x0
**************************************************************************************************

对比二:

①引用一个retainCount=0的指针,是出错的:

<wbr>[object release];</wbr>

<wbr>NSLog(@"%@",object);//出错<br> ②引用一个内存地址:0x0的指针,是不会出错的:</wbr>

<wbr>object=nil;</wbr>

<wbr>NSLog(@"%@",object);//不出错</wbr>

*************************************************************************************************

嘘……下面我来一个高度的概括,连苹果官网都没我这个概括那么概括。千万不要告诉人家(不过你告诉人家,我也没办法,不绝对不会追究知识产权的)。

一个指针调用 release 函数,是会影响到所有指向同一对象的指针。总的来说,释放内存(rlease)方面,所有的指针是Shared的。

一个指针=nil,只会影响到本身,不会影响到所有指向同一对象的其它指针。总的来说,指针清空(=nil)方面,所有的指针是Independent的。


在Kratos框架中,您可以使用依赖注入(Dependency Injection)的方式来初始化和使用缓存。以下是一个示例代码,展示了如何在程序启动时初始化用户缓存: 1. 创建一个`UserCache`结构体,用于管理用户缓存数据: ```go type UserCache struct { // 在这里定义您需要的缓存相关字段 } func NewUserCache() *UserCache { // 在这里进行缓存的初始化操作,如连接缓存服务器等 return &UserCache{} } func (c *UserCache) Get(userID string) (*ent.User, error) { // 从缓存中获取用户数据 // ... } func (c *UserCache) Set(userID string, user *ent.User) error { // 将用户数据缓存到缓存中 // ... } func (c *UserCache) Flush() error { // 清空缓存 // ... } ``` 2. 在启动函数中初始化和使用`UserCache`: ```go func main() { cache := NewUserCache() // 初始化时执行缓存用户 ctx := context.TODO() userID := "123456" // 假设要缓存的用户ID user, err := cache.Get(userID) if err != nil { // 处理错误 } // 清空所有缓存 err = cache.Flush() if err != nil { // 处理错误 } // 重新缓存 err = cache.Set(userID, user) if err != nil { // 处理错误 } // 其他初始化操作... // 启动服务 if err := app.Run(); err != nil { panic(err) } } ``` 请根据您的具体需求进行适当调整和修改。在上述示例中,`UserCache`结构体用于封装缓存相关的操作,并在程序启动时进行初始化和使用。您可以在需要缓存用户数据的地方调用相应的方法来获取、设置或清空缓存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值