首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏浮躁的喧嚣

    内存管理--36:不要使用retainCount

    对象的引用计数看似有用,实则不然,因为任何给定的时间点上的“绝对保留计数”都无法反应对象生命期的全貌 ARC环境中,已将retainCount废弃

    9900编辑于 2023-11-22
  • 来自专栏Core Net

    IOS @proporty 关键字(一)retain strong

    =%lu",(unsigned long)testRetain.retainCount); //2 NSLog(@"user.tRetain.retainCount=%lu",(unsigned = testRetain2; NSLog(@"testRetain.retainCount=%lu",(unsigned long)testRetain.retainCount); //1 NSLog(@"testRetain2.retainCount=%lu",(unsigned long)testRetain2.retainCount); //4294967295 NSLog(@" long)testRetain3.retainCount); //1 [testRetain3 retain]; NSLog(@"testRetain3.retainCount=%lu" :testRetain3]; NSLog(@"testRetain3.retainCount=%lu",(unsigned long)testRetain3.retainCount); //3

    64550发布于 2018-05-17
  • 来自专栏菩提树下的杨过

    objective-C 的内存管理之-自动释放池(autorelease pool)

    s2.retainCount=%d",[s1 retainCount],[s2 retainCount]); [s1 autorelease];//retainCount仍为1 NSLog( @"s1.retainCount=%d,s2.retainCount=%d",[s1 retainCount],[s2 retainCount]); [s2 retain];//retainCount =2 [s2 autorelease];//retainCount仍为2 NSLog(@"s1.retainCount=%d,s2.retainCount=%d",[s1 retainCount [461:a0f] s1.retainCount=1,s2.retainCount=1 2011-02-24 13:49:22.566 MemoryManage[461:a0f] s1.retainCount =1,s2.retainCount=1 2011-02-24 13:49:22.567 MemoryManage[461:a0f] s1.retainCount=1,s2.retainCount=2 2011

    1.4K100发布于 2018-01-22
  • 来自专栏青玉伏案

    Objective-C中的内存管理

    = %d",(int)string.retainCount);//retainCount = -1 [string retain]; //没用 NSLog(@"str常量的retainCount = %d",(int)string.retainCount);//retainCount = -1     ​    ​    ​运行结果: 1 2 2014-08-03 20:01:31.360 Memory *string2 = [NSString stringWithString:string]; NSLog(@"传入字符串常量 RetainCount = %d", (int)string2.retainCount = %d",(int)string1.retainCount);    //retainCount = 3 NSLog(@"传入的变量RetainCount = %d", (int)string3.retainCount );//retainCount = 3     ​    ​    ​运行结果: 1 2 3 2014-08-03 20:18:37.240 Memory[2499:303] 传入字符串常量 RetainCount

    1.3K90发布于 2018-01-11
  • 来自专栏菩提树下的杨过

    objective-C 的内存管理之-引用计数

    每个对象(特指:类的实例)内部都有一个retainCount的引用计数,对象刚被创建时,retainCount为1,可以手动调用retain方法使retainCount+1,同样也可以手动调用release sample.retainCount=%d",[_sample retainCount]);//2 [_sample retain]; NSLog(@"_sample.retainCount=% d",[_sample retainCount]);//3 [_sample release]; NSLog(@"_sample.retainCount=%d",[_sample retainCount ,当前引用计数:1 NSLog(@"_sample.retainCount=%d",[_sample retainCount]);//1,注:即便是在析构函数执行后,如果立即再次引用对象的retainCount @"is nil":@"is not nil",[s retainCount]);//s is not nil,retainCount=1 //NSLog(@"s %@,retainCount=%d"

    1.1K100发布于 2018-01-22
  • 来自专栏青玉伏案

    Objective-C中的深拷贝和浅拷贝

    因为OC中用引用计数的方式来进行内存管理的所以我们也可以通过观察对象retainCount的变化来分析对象之间是否是深拷贝还是浅拷贝。 (@"str1 = %@, retain_str1.retainCount = %d",str1, (int)str1.retainCount);   //把str通过copy的方式把值赋给str2 NSString *str2 = [str copy]; NSLog(@"str2 = %@, copy_str2.retainCount   = %d", str2, (int)str2.retainCount); = %@,  retain_s1_retainCount = %d", s1, (int)s1.retainCount);   //把s通过copy的方式把值赋给s2; NSMutableString [0] = %@, copy_array.retainCount = %d", array2[0], (int)array2.retainCount); //把array通过mutableCopy

    1.3K90发布于 2018-01-11
  • 来自专栏Elton的技术分享博客

    为什么要在addsubview:一个view对象后,release它

    我们逐行分析一下 第一行,alloc一次,imgView对象retainCount为1, 第二行,addSubview一次,此方法会把你传过去的对象retain一次,那么此时它的retainCount为 第三行,调用release方法,此处释放对imgView的所有权,retainCount减1。 到语言句尾imgView的所有者只剩下self.view,并且它的retainCount仅为1。

    49420发布于 2021-01-22
  • 来自专栏老沙课堂

    浅入深出Copy和mutableCopy

    NSString *a = [NSString stringWithFormat:@"abc"]; NSLog(@"a retainCount = %ld",[a retainCount]); NSString *b = [a copy]; NSLog(@"a retainCount = %ld",[a retainCount]); NSString *c = [a mutableCopy ; NSLog(@"%p,%p,%p",a,b,c); 结果 2019-09-12 13:54:58.109757+0800 Copy MutableCopy[13700:49429440] a retainCount = -1 2019-09-12 13:54:58.109876+0800 Copy MutableCopy[13700:49429440] a retainCount = -1 2019-09-12

    66220发布于 2019-09-28
  • 来自专栏coding...

    C语言基础 - 实现动态数组并增加内存管理

    属性.为内存计数器 使用一次retainCount+1,当retainCount为0时 释放该对象指向的内存 贴出部分代码 // Object.h #ifndef Object_h #define Object_h #include <stdio> //定义结构体 typedef struct Object{ int retainCount; }Object; //宏定义方法 方便书写 ++; // printf("retain计数+1 = %d\n",obj->retainCount); } void objectRelease(Object *obj) { obj ->retainCount --; if (obj->retainCount <= 0) { free(obj); } // printf("retain计数-1 = %d\n",obj->retainCount); } //获得当前计数 int getRetainCount(Object *obj) { return obj->retainCount;

    1.9K30发布于 2018-08-23
  • 来自专栏Code_iOS

    Objective-C 内存管理(上)学习笔记

    值加 1; release既是把retainCount值减 1 dealloc只有在 retainCount = 0 的时候,由系统自动调用 autorelease是把对象加进自动释放池中,由系统自动为池中的对象发送 引用计数:就是分配的 内存区块 多少个 OC对象所持有(掌管;保持且拥有),间接表示就是retainCount值的大小。 对象... , 请看下表: OC操作方法 对象的操作 retainCount alloc/new/copy/mutablecopy等 生成并持有对象 1? 勾选僵尸对象检测 情况 1:过快释放了对象(不要理retaiinCount把注意力放在对象被持有的个数上) retainCount的补充: ? 运行结果 疑问:mArrayCopy的retainCount是2 ?被持有者有两个? ?

    1K20发布于 2018-09-04
  • 来自专栏iOS开发内存管理

    iOS内存管理(一)-基本的概念

    内存管理 图片 内存布局 图片 什么是引用计数 Objective-C通过retainCount的机制来决定对象是否需要释放。 每次runloop迭代结束后,都会检查对象的retainCount,如果retainCount等于0,就说明该对象没有地方需要继续使用它,可以被释放掉了。 无论是手动管理内存,还是ARC机制,都是通过对retainCount来进行内存管理的。 内存中每一个对象都有一个属于自己的引用计数器。 引用计数器的管理 图片 引用计数的存储 图片 SideTable 图片 图片 图片 底层的实现 retainCount 图片 release 图片 RefCountMap的原理 通过计算对象地址的哈希值

    60470编辑于 2023-07-20
  • 来自专栏技术总结

    FBKVOController源码剖析与学习

    is %lu",self.name,[self retainCount]]; } - (void)dealloc { self.name = nil; self.family = nil is 3", "swift's retainCount is 3", "android's retainCount is 3", "java's retainCount is 3", "ruby's retainCount is 3" ) 可以看出每个person的retainCount为3,因为family持有person,person持有family,如果我们运用NSHashTable is 2", "swift's retainCount is 2", "android's retainCount is 2", "java's retainCount is 2", "ruby's retainCount is 2" ) 可看出,已解决循环引用 2、宏定义魔法 先看一下系统的KVO方法 [testPerson addObserver:self forKeyPath:@"

    1.1K40发布于 2018-09-30
  • 来自专栏菩提树下的杨过

    objective-C 的内存管理之-实例分析

    synthesize flag; - (NSString *) description { return ([NSString stringWithFormat:@"I am engine %d,my retainCount =%d",flag,[self retainCount]]); } // description -(void) dealloc { NSLog(@"this engine %d is going 报废 [engine2 release];//新引擎engine2当然也不再需要了 同样有二个问题: 2.1 engine1先被new了一次,然后在setEngine中又被retain了一次,也就是说其retainCount 为2,虽然代码中后来release了一次,但是也只能让retainCount减到1,并不能销毁! Engine *engine1 = [Engine new];//engine1.retainCount=1 engine1.flag = 1; Car *car1 = [Car new]; car1

    65480发布于 2018-01-22
  • 来自专栏青玉伏案

    Objective-C中的单例模式

    2 3 4 -(id)mutableCopyWithZone:(NSZone *)zone {     return self; }     ​5.防止用户把创建的单例dealloc,我们需要重写retainCount 方法 1 2 3 4 5 //重写retainCount方法,防止被dealloc,返回最大值 -(NSUInteger) retainCount {     return NSUIntegerMax; SingletonClass *single6 = [single1 retain]; [single1 release];   [single1 singletonFunction]; NSLog(@"single_retainCount = %lu", single1.retainCount);   //输出地址 NSLog(@"getInstance     single1_P = %p", single1); NSLog(@"new 2014-08-07 16:04:44.207 Memory[20664:303] single_retainCount = 18446744073709551615 2014-08-07 16:04:

    2.2K70发布于 2018-01-11
  • 来自专栏ShaoYL

    IOS开发系列—Objective-C之Foundation框架

    (str1)=%lu,retainCount(str2)=%lu",[str1 retainCount],[str2 retainCount]); //结果:retainCount(str1)= (str1)=%lu,retainCount(str3)=%lu",str1.retainCount,str3.retainCount); //结果:retainCount(str1)=2,retainCount (str3)=%i",str3.retainCount); //结果:1 [str3 retain]; NSLog(@"retainCount(str3)=%i",str3.retainCount (str4)=%i",str4.retainCount); //结果:1 [str4 retain]; NSLog(@"retainCount(str4)=%i",str4.retainCount (str5)=%i",str5.retainCount); //结果:1 [str5 retain]; NSLog(@"retainCount(str5)=%i",str5.retainCount

    1K60发布于 2018-06-20
  • 来自专栏ShaoYL

    单例设计模式

    实现 NSCopying 协议,覆盖 release,autorelease,retain,retainCount 方法,以此确保单例的状态。 } - (id)copyWithZone:(NSZone *)zone { return segtonInstance; } //覆盖 release,autorelease,retain,retainCount 方法方法 //返回本身 -(id)retain { return self; } -(NSInteger)retainCount { return UINT_MAX; } -(id

    690120发布于 2018-05-11
  • 来自专栏Elton的技术分享博客

    如何获得对象的retain count

    NSLog([NSString stringWithFormat:@"Retain Count:%i", [someObject retainCount]]); 对象的retainCount方法就会反回这个对象的

    2.6K40发布于 2021-01-26
  • 来自专栏猿人谷

    addSubView需要注意的几个点为什么要在addsubview:一个view对象后,release它?

    我们逐行分析一下 第一行,alloc一次,imgView对象retainCount为1, 第 二行,addSubview一次,此方法会把你传过去的对象retain一次,那么此时它的retainCount 第三行,调用release方法,此处释放对imgView的所有权,retainCount减1。 到语言句尾imgView的所有者只剩下self.view,并且它的retainCount仅为1。

    1.6K100发布于 2018-01-17
  • 来自专栏MelonTeam专栏

    Objective-C内存管理原理探究(一)

    define FAST_IS_SWIFT (1UL<<0) // class or superclass has default retain/release/autorelease/retainCount 1UL<WORD_BITS-1)) #define SIDE_TABLE_RC_SHIFT 2 #define SIDE_TABLE_FLAG_MASK (SIDE_TABLE_RC_ONE-1) 每个retainCount 都是size_t,是无符号整形 所以根据上面的宏定义,一个retainCount的位区域划分如下图 ? 三、retainCount、dealloc的实现 retainCount实现 - (NSUInteger)retainCount { return ((id)self)->rootRetainCount (); } uintptr_t objc_object::sidetable_retainCount() { SideTable& table = SideTables()[this];

    1.3K100发布于 2018-01-04
  • 来自专栏王大锤

    iOS的内存管理

    :%lu",(unsigned long)_objc_rootRetainCount(obj1)); NSLog(@"strong obj retainCount:%lu",(unsigned ]); NSObject *another = [object retain]; NSLog(@"Reference Count = %u", [object retainCount]); [another 因为该对象的内存已经被回收,而我们向一个已经被回收的对象发了一个 retainCount 消息,所以它的输出结果应该是不确定的,如果该对象所占的内存被复用了,那么就有可能造成程序异常崩溃。 这是因为当最后一次执行 release 时,系统知道马上就要回收内存了,就没有必要再将 retainCount 减 1 了,因为不管减不减 1,该对象都肯定会被回收,而对象被回收后,它的所有的内存区域, 包括 retainCount 值也变得没有意义。

    1.2K80发布于 2018-05-17
领券