标签: retaincount

目标c - 参考计数

直到五分钟我才确定我对Objective c引用计数的理解非常好,但是当我开始检查对象retainCount时,我很惊讶地看到我所看到的.

例如,myViewController有一个UITableview:

.h文件

@interface RegularChatViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
{
     UITableView *_tableView;
}
@property (nonatomic, retain) IBOutlet UITableView *tableView; 
Run Code Online (Sandbox Code Playgroud)

.m文件

@synthesize tableView = _tableView;

- (void)loadView
{
    _tableView = [[UITableView alloc] init];  // STEP ONE
    NSLog(@"tableView retain count: %d",[_tableView retainCount]);

    self.tableView.frame = CGRectMake(0, 0, 320, tableHeight); // STEP TWO
    NSLog(@"tableView retain count: %d",[_tableView retainCount]);  

    [self.view addSubview:self.tableView]; // STEP THREE
    NSLog(@"tableView retain count: %d",[_tableView retainCount]); 
}
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,输入是:

tableView retain count: 1
tableView retain count: 2
tableView retain count: 3
Run Code Online (Sandbox Code Playgroud)

显然,STEP …

iphone reference-counting objective-c ios retaincount

6
推荐指数
1
解决办法
1461
查看次数

如何在NSObject中实现保留计数?

我的问题是当前版本的Foundation(或Objective-C运行时库,因为它似乎在那里)如何实现NSObject派生对象的保留计数?正如我在NSObject.mm上看到的那样,retain countNSObject界面体中没有调用ivar .相反,似乎有一种表或映射包含每个对象的引用计数器.但是,如果保留计数真的与地图做,是不是retainrelease行动与这种实现(因为太贵了,在这种情况下,有必要锁定和解锁互斥,查找地图,找到合适的对象,除了事实那么,在多线程环境中,一次只能保留/释放一个对象)?

我没有找到相关的新对象的分配时,保留计数器设置为1东西,无论是在_objc_rootAllocWithZoneNSObject.mm(这似乎是被调用的函数[NSObject alloc])也不_class_createInstanceFromZoneobjc-runtime-new.mm(即后来被称为_objc_rootAllocWithZone.

cocoa objective-c objective-c-runtime nsobject retaincount

5
推荐指数
1
解决办法
867
查看次数

ARC:__bridge与__bridge_retained使用contextInfo测试用例

考虑这个ARC代码:

- (void)main {
    NSString *s = [[NSString alloc] initWithString:@"s"];
    [NSApp beginSheet:sheet 
           modalForWindow:window 
           modalDelegate:self 
           didEndSelector:@selector(sheetDidEnd:returnCode:context:) 
           contextInfo:(__bridge void *)s
    ];
}

- (void)sheetDidEnd:(NSWindow *)sheet returnCode:(NSInteger)returnCode context:(void *)context {
    NSString *s = (__bridge_transfer NSString *)context;
}
Run Code Online (Sandbox Code Playgroud)

问题:在第7行,应该__bridge使用,或者__bridge_retained,或者无关紧要,或者选择是否依赖于字符串的保留计数(即,是否显式分配字符串与是否通过类初始化程序自动释放+[NSString stringWithString:]

memory-management objective-c retaincount automatic-ref-counting toll-free-bridging

5
推荐指数
1
解决办法
3529
查看次数

使用不显示参考计数的仪器

我正在努力确定使用仪器分配和/或泄漏从视图层次结构中删除并设置为 nil 的对象所持有的内容(据我所知,将所有委托设置为 nil 并删除所有通知)。

我启用了“记录引用计数”选项,但我看不到该信息的显示位置。我认为没有 RefCt 列(参见附图)。我该如何让它出现?我使用的是 Xcode 版本 8.0 (8A218a)。

有没有办法分析哪些对象保留子对象?

在此输入图像描述

instruments ios retaincount xcode-instruments swift

5
推荐指数
1
解决办法
2051
查看次数

在目标c中保留可变和不可变对象的计数?

NSArray *arr=[[NSArray alloc]init]; //Am getting all immutable objects allocation that retain count:2  
NSLog(@"dic1:%d",[arr retainCount]); 
[arr retain];
[arr retain];
[arr retain];
[arr release];
 NSLog(@"dic2:%d",[arr retainCount]);


NSMutableDictionary *dic=[[NSMutableDictionary alloc]init];//Am getting all mutable objects allocation that retain count:1  
NSLog(@"dic3:%d",[dic retainCount]);
[dic retain];
[dic retain];
[dic retain];
[dic release];
NSLog(@"dic4:%d",[dic retainCount]);
Run Code Online (Sandbox Code Playgroud)

输出:dic1:2 dic2:4 dic3:1 dic4:3

可变对象之间的差异是什么,保留计数和不可变对象保留计数?请给我解决方案...

objective-c retaincount

4
推荐指数
1
解决办法
253
查看次数

这增加了保留计数:alloc还是init?

当我们需要创建一个对象并获得它的所有权时,我们会写

NSObject *someObject = [[NSObject alloc] init];
Run Code Online (Sandbox Code Playgroud)

之后,someObject保留计数将等于1.哪种方法会增加计数,alloc或者init,在Apple的文档中,这种行为的描述是什么?

objective-c init alloc retaincount

4
推荐指数
3
解决办法
2328
查看次数

为什么将计数保留在负值?

可能重复:
NSString保留Count

是否有可能任何对象的保留计数为负值?

我有这个代码

NSString *str = [[NSString alloc] initWithString:@"Hello World"];
NSLog(@"String Retain Count: %i", [str retainCount]);
Run Code Online (Sandbox Code Playgroud)

这将返回保留计数 -1.

为什么会这样?

我也是这样做的

NSString *str = [[NSString alloc] init]
Run Code Online (Sandbox Code Playgroud)

仍然是保留计数中的返回负值.

这是怎么回事?

请帮忙了解这件事!!!!!

iphone memory-management objective-c ios retaincount

4
推荐指数
1
解决办法
553
查看次数

使用AVAudioPlayer后突然没声音 - 请援助["AppleAudioQueue.39.189049"(25)flags = 0x2 errno = 24]

我是一个新手,我可能做了很多错事,因此,我真的需要你的专业知识和帮助!

我正在创建一个使用AVFoundation Framework的音乐应用程序.当我在我的Macbook和iOS设备上测试时,它在开始时实际上运行良好.但是在我按下50-100次不同的音频播放按钮后,它会随机停止工作.该应用程序不会崩溃,但它不会播放任何声音.我真的不明白为什么,请帮助我.

更新(2013年6月7日):在这里,我现在弄清楚问题是什么,但我不明白...它在调试器中说这个:shm_open失败:"AppleAudioQueue.39.189049"(25)flags = 0x2 errno = 24请尽可能帮助:o!

这是我的代码:

[array1 retain];[array1 retain];[array1 retain];
Run Code Online (Sandbox Code Playgroud)
NSBundle *bundle = [NSBundle mainBundle];
NSString *path = [bundle pathForResource:[NSString stringWithFormat:@"%@", [[Scale objectAtIndex:array1.retainCount]description]] ofType:@"mp3" inDirectory:@"Piano"];

NSURL *url = [NSURL fileURLWithPath: path];
player = [[AVAudioPlayer alloc]
          initWithContentsOfURL:url error:nil];
[player setNumberOfLoops:0];
[player play];
Run Code Online (Sandbox Code Playgroud)

这个问题的一个潜在原因是因为我正在使用[array retain/release]和使用数组retainCount来引用许多不同的对象.这会导致内存泄漏还是类似的东西?

你好bbum,谢谢你的帮助.供您参考,这是我的愚蠢代码的一部分..我知道它有点乱,如果您需要我的解释或更多细节,请告诉我:

    - (IBAction)P1C:(id)sender{


KeyCountA1 = [NSMutableArray arrayWithObjects:@"1",@"3",@"5",@"8",@"10",@"12",@"15",@"17",@"19",@"22",@"24",@"26",@"29",@"31",@"33",@"36",@"38",@"40",@"43",@"45",@"47",@"50",@"52",nil];
KeyCountA2 = [NSMutableArray arrayWithObjects:@"0",@"2",@"4",@"6",@"9",@"11",@"13",@"16",@"18",@"20",@"23",@"25",@"27",@"30",@"32",@"34",@"37",@"39",@"41",@"44",@"46",@"48",@"51",nil];
KeyCountA3 = [NSMutableArray arrayWithObjects:@"0",@"3",@"5",@"7",@"10",@"12",@"14",@"17",@"19",@"21",@"24",@"26",@"28",@"31",@"33",@"35",@"38",@"40",@"42",@"45",@"47",@"49",@"52",nil];
KeyCountA4 = [NSMutableArray arrayWithObjects:@"1",@"4",@"6",@"8",@"11",@"13",@"15",@"18",@"20",@"22",@"25",@"27",@"29",@"32",@"34",@"36",@"39",@"41",@"43",@"46",@"48",@"50",nil];
KeyCountA5 = [NSMutableArray arrayWithObjects:@"2",@"5",@"7",@"9",@"12",@"14",@"16",@"19",@"21",@"23",@"26",@"28",@"30",@"33",@"35",@"37",@"40",@"42",@"44",@"47",@"49",@"51",nil];
KeyCountA6 = [NSMutableArray arrayWithObjects:@"1",@"3",@"6",@"8",@"10",@"13",@"15",@"17",@"20",@"22",@"24",@"27",@"29",@"31",@"34",@"36",@"38",@"41",@"43",@"45",@"48",@"50",@"52",nil];
KeyCountA7 = …
Run Code Online (Sandbox Code Playgroud)

audio objective-c avfoundation ios retaincount

4
推荐指数
1
解决办法
494
查看次数

我应该将__unsafe_unretained用于临时变量吗?

假设我想创建一个临时变量,例如:

  1. 指向另一个长寿变量:

    __unsafe_unretained UIView *tableHeaderView = self.tableView.tableHeaderView;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 指向我刚刚创建的对象.

    __unsafe_unretained UIView *tableHeaderView = [[UIView alloc] init];
    
    Run Code Online (Sandbox Code Playgroud)

这些临时变量不需要保留,因为只要临时变量在范围内,它们指向的对象就可以保证保留正保留计数.那么,我应该声明它们__unsafe_unretained吗?

objective-c retaincount automatic-ref-counting unsafe-unretained

3
推荐指数
1
解决办法
652
查看次数

RetainCount可以在这个例子中使用吗?

RetainCount ==坏

retainCount禁忌,不可靠,不可预测,一般不应使用.我不会在我的代码中的任何地方使用它,但我在一个类中看到它,我以一种有趣的方式使用它.

我有一个类运行一个无限运行的线程,直到线程被取消.问题是线程增加了所有者的保留计数,在我的例子中是实例化它的类.所以,即使我已经完成了使用该类,该实例仍然会出现问题,除非管理我的类的人也有智能知道关闭该线程.这是一个解决方案,但这是我在代码中找到的.

- (oneway void)release
{
    // This override allows allows this object to be dealloced 
    // by shutting down the thread when the thread holds the last reference.
    // Otherwise, the object will never be dealloc'd
    if (self.retainCount == 2)
    {
        [self quitDispatchThread];
    }

    [super release];
}
Run Code Online (Sandbox Code Playgroud)

这是一个聪明的解决方案,但我不确定该怎么想.它会覆盖类上的释放并检查保留计数是否为2.换句话说,它会检查线程是否是保持对象存活的唯一因素(因为保留计数将从2减少到1)如果是,则终止线程(quitDispatchThread将阻塞直到线程终止).

所以...

你能依靠retainCount看看它是否是一个?

通常人们会说要保持清醒,retainCount因为你不知道那里是否有一些自动释放.但是,如果retainCount是1,那么我知道只有线程保持活着的事实我不必担心retainCount可能因某些自动释放等而关闭...

这段代码出了什么问题?

我准备删除它,但它实际上似乎是有道理的.其他对象不必知道我的类正在运行一个线程.其他对象可以安全地retainrelease甚至autorelease拥有线程,而不必担心查封了线程,因为它需要自己照顾的对象.

这段代码实际上感觉干净,令我感到惊讶.

编辑:: NSThread正在保留我的对象

我使用NSThread的事实增加了我的对象的保留计数.我的对象是,target并且selector是线程运行的方法.

initWithTarget:选择器:对象:

返回使用给定参数初始化的NSThread对象.

  • (id)initWithTarget:(id)目标选择器:(SEL)选择器对象:(id)参数 …

objective-c nsthread ios retaincount

3
推荐指数
1
解决办法
247
查看次数