我想知道你-retainCount
到目前为止在什么情况下使用过,最后使用它可能发生的问题.
谢谢.
或者,为什么retainCount
我的暑假没有使用
这篇文章的目的是征求关于臭名昭着的方法的原因和原因的详细报道retainCount
,以巩固围绕SO的相关信息.*
基础知识:不使用的官方理由是什么retainCount
?是否有过任何情况下都当它可能是有用的?应该做些什么?**随意编辑.
历史/解释:如果不打算使用Apple,为什么Apple在NSObject
协议中提供此方法?Apple的代码是否依赖于retainCount
某些目的?如果是这样,为什么不把它隐藏在某个地方?
为了更深入地理解:对象可能具有与用户代码假设不同的保留计数的原因是什么?您能否举例说明框架代码可能会使用哪些标准程序导致这种差异?是否有任何已知的情况,保留计数总是与新用户可能期望的不同?
你认为还有什么值得关注的retainCount
吗?
*不熟悉Objective-C和Cocoa的编码人员经常努力解决或至少误解参考计数方案.教程解释可能提及保留计数,这(根据这些解释)当你打电话上去一个retain
,alloc
,copy
由一个当你调用等,向下release
(并在当你调用未来的某一时刻autorelease
).
因此,一个崭露头角的可可黑客克里斯可以很容易地认识到,检查一个对象的保留计数对于解决一些内存问题是有用的,而且,有一种方法可用于每个被调用的对象retainCount
!克里斯打电话retainCount
给几个对象,这个对象太高了,而且这个对象太低了,到底发生了什么?!因此,Kris在SO上发帖,"我的记忆管理出了什么问题?" 然后一群<bold>,<large>字母下降说"不要那样做!你不能依靠结果.",这是好的,但我们的强悍编码器可能需要更深入的解释.
我希望这会变成一个常见问题解答,一个很好的信息论文/讲座的页面,我们的任何专家都倾向于写一个,当他们想知道时可以指出新的可可头retainCount
.
**我不想让它过于宽泛,但是经验或有关验证/调试保留和释放配对的文档的具体提示可能适合此处.
***在虚拟代码中; 很明显,一般公众无法访问Apple的实际代码.
我有一个UITableView
带UINavigation
控制器的第一个屏幕.
在我的第一个屏幕中,我NSLog(@"Home Screen retain Count=%d",[self retainCount]);
和它在viewDidLoad
调用它时会记录6 .
它是否正确?
有人知道在调试模式下如何检查对象的保留计数?我试图添加一个表达式,[objInstance retainCount]
但它没有用.我也在控制台中尝试了打印对象 PO [objInstance retainCount]
,但它再次无效.
我对偶然发生的碰撞感到困惑,根据Zombies乐器的说法,这是由于一些字典值的过度释放造成的.当我查看Instruments中这些过度释放的对象之一的对象历史时,我发现它的保留计数在一个阶段从+2直接下降到0.(看一下帖子末尾的截图).我不清楚这是怎么可能的.
我应该说在使用Instruments进行分析时我只看到这种崩溃,所以我认为它可能是一个Apple漏洞,但是假设它是导航错误可能更安全,而Instruments只是暴露出来.
无论如何,我正在构建一个包含一些Core Foundation对象(CFStrings和CFNumbers)的CFDictionary,然后我将它转换为NSDictionary*并将其传递给Objective-C方法.我的代码的简化版本如下:
// creates a CFDictionary containing some CFStrings and CFNumbers
void doStuff()
{
CFDictionaryRef myDict = CreateMyDictionaryContainingCFTypes();
dispatch_async(myQueue, ^{
[someObject receiveDictionary:(NSDictionary*)myDict];
CFRelease(myDict); // this line causes a crash. The Zombies instrument
// claims a CFString value contained in this
// dictionary has already been freed.
});
}
// ...
- (void)receiveDictionary:(NSDictionary*)dict
{
NSAutoreleasePool *pool = [NSAutoreleasePool new];
NSString* str1 = [dict objectForKey:@"key1"];
NSString* str2 = [dict objectForKey:@"key2"];
NSNumber* num1 = [dict objectForKey:@"key3"];
dispatch_async(myOtherQueue, ^{
[database executeUpdate:@"INSERT INTO …
Run Code Online (Sandbox Code Playgroud) objective-c instruments nszombie grand-central-dispatch retaincount
我想知道一个对象被自动释放了多少次.我已经使用了足够长的目标c,通常可以直接知道某个对象是否已经自动释放,但是我经常会看到处理内存和保留计数的问题.在某些时候,答案总是结束,"你不能相信一个对象的retainCount" - 我同意这一点,但如果你能确定一个对象被自动释放的次数,那么你真的可以信任 retainCount如果你添加了像这样的类别:
@interface NSObject (NSObject_MemoryDebugging)
- (NSUInteger) autoReleaseCount;
- (NSUInteger) retainCountWithAutoRelease;
@end
@implementation]
/** Determine how many times this object has been marked for autorelease **/
- (NSUInteger) autoReleaseCount;
{
// ??? not sure how to figure this out.
return 0;
}
- (NSUInteger) retainCountWithAutoRelease
{
NSUInteger retainCount = [self retainCount];
NSUInteger autoReleaseCount = [self getAutoReleaseCount]; // ???
return retainCount - autoReleaseCount;
}
@end
Run Code Online (Sandbox Code Playgroud)
对于不可变类型仍然存在异常,因为这些通常会在复制期间增加保留计数,因此您仍然无法信任retainCount.
我不是在生产代码中使用retainCount来寻求此答案.但是,我可以看到这对于调试内存问题的人来说很有价值.
我想有些人会讨厌这个问题,因为程序员不应该关心对象被自动释放的次数.编码应该是关于平衡分配,保留,复制,新版本和故事结束.然而,重点是帮助人们敲打头脑. [NSObject retainCount]
烧了很多人,这个问题的答案会很酷.
我确定有一种方法可以确定一个对象被自动释放的次数.我只是不知道它是什么,因此问题.
看到类似的问题:Objective-c中NSAutoreleasePool内的对象.
谢谢大家的答案.你可能会发现这个有趣的=> …
我仍然试图理解我在一个项目中找到的这段代码,我正在研究那个创建它的人离开公司之前我可以问的问题.
这是代码:
-(void)releaseMySelf{
for (int i=myRetainCount; i>1; i--) {
[self release];
}
[self autorelease];
}
Run Code Online (Sandbox Code Playgroud)
据我所知,在Objective-C内存管理模型中,第一条规则是分配另一个对象的对象也负责在将来释放它.这就是我不理解这段代码含义的原因.有什么意义吗?
当我对这个对象进行保留计数时,它是2.这是为什么?当然它应该是一个,因为我刚刚初始化它并没有分配它或任何东西......
let testC: TestClass = TestClass()
print(CFGetRetainCount(testC))
Run Code Online (Sandbox Code Playgroud)
这是在一个空的单视图xcode项目中完成的... TestClass是一个空类,viewcontroller实例化它一次,保留计数为2:
reference-counting retain retaincount automatic-ref-counting
我正在制作iPhone游戏.我想释放已分配或保留的所有对象.在dealloc
我发布所有这些对象的函数中,但后来我意识到有时候我还没有分配对象时最终释放对象.所以我想retainCount
在发布它之前我需要检查它是否大于零.
我的问题是:
我只是检查是否retainCount
大于零,然后释放它?
if([bg retainCount]!=0)
{
[bg release];
}
Run Code Online (Sandbox Code Playgroud)
要么
我应该多次发布它 retainCount
while([bg retainCount]!=0)
{
[bg release];
}
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!
我测试了它,看起来确实如此.所以我的问题是,它总是增加保留计数.
所以每次我做这样的事情:
UIView *theView = [[[UIView alloc] initWithFrame:(CGRect)aFrame] autorelease];
[self.view addSubview:theView];
Run Code Online (Sandbox Code Playgroud)
我实际上是在泄漏记忆吗?
我有一个全局属性@property (nonatomic, retain) UILabel *ingredientsTextLabel;
,我viewDidLoad
使用此代码实例化:
我只有名为的属性,在我的标题中没有属性,所以没有getter和setter.在我的viewDidLoad
:
ingredientsTextLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, ingredientsScrollView.frame.size.width, ingredientsScrollView.frame.size.height)];
[ingredientsTextLabel setBackgroundColor:[UIColor clearColor]];
[ingredientsTextLabel setFont:[UIFont fontWithName:@"Helvetica" size:18]];
[ingredientsTextLabel setText:ingredientsText];
[ingredientsTextLabel setNumberOfLines:0];
[ingredientsTextLabel setLineBreakMode:UILineBreakModeWordWrap];
NSLog(@"%i",[ingredientsTextLabel retainCount]); // here retain count is 1
CGSize maxSize = CGSizeMake(ingredientsScrollView.frame.size.width, 9999);
CGSize ingLabSize = [ingredientsText sizeWithFont:ingredientsTextLabel.font
constrainedToSize:maxSize
lineBreakMode:ingredientsTextLabel.lineBreakMode];
[ingredientsTextLabel setFrame:CGRectMake(ingredientsTextLabel.frame.origin.x, ingredientsTextLabel.frame.origin.x, ingredientsTextLabel.frame.size.width, ingLabSize.height)];
[ingredientsScrollView addSubview:ingredientsTextLabel];
NSLog(@"%i",[ingredientsTextLabel retainCount]); // here retain count is 2! …
Run Code Online (Sandbox Code Playgroud) retaincount ×10
objective-c ×7
iphone ×3
ios ×2
retain ×2
autorelease ×1
cocoa ×1
cocoa-touch ×1
debugging ×1
instruments ×1
memory-leaks ×1
nszombie ×1
release ×1