直到五分钟我才确定我对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 …
我的问题是当前版本的Foundation(或Objective-C运行时库,因为它似乎在那里)如何实现NSObject派生对象的保留计数?正如我在NSObject.mm上看到的那样,retain count在NSObject界面体中没有调用ivar .相反,似乎有一种表或映射包含每个对象的引用计数器.但是,如果保留计数真的与地图做,是不是retain和release行动与这种实现(因为太贵了,在这种情况下,有必要锁定和解锁互斥,查找地图,找到合适的对象,除了事实那么,在多线程环境中,一次只能保留/释放一个对象)?
我没有找到相关的新对象的分配时,保留计数器设置为1东西,无论是在_objc_rootAllocWithZone在NSObject.mm(这似乎是被调用的函数[NSObject alloc])也不_class_createInstanceFromZone在objc-runtime-new.mm(即后来被称为_objc_rootAllocWithZone.
考虑这个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
我正在努力确定使用仪器分配和/或泄漏从视图层次结构中删除并设置为 nil 的对象所持有的内容(据我所知,将所有委托设置为 nil 并删除所有通知)。
我启用了“记录引用计数”选项,但我看不到该信息的显示位置。我认为没有 RefCt 列(参见附图)。我该如何让它出现?我使用的是 Xcode 版本 8.0 (8A218a)。
有没有办法分析哪些对象保留子对象?
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
可变对象之间的差异是什么,保留计数和不可变对象保留计数?请给我解决方案...
当我们需要创建一个对象并获得它的所有权时,我们会写
NSObject *someObject = [[NSObject alloc] init];
Run Code Online (Sandbox Code Playgroud)
之后,someObject保留计数将等于1.哪种方法会增加计数,alloc或者init,在Apple的文档中,这种行为的描述是什么?
可能重复:
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)
仍然是保留计数中的返回负值.
这是怎么回事?
请帮忙了解这件事!!!!!
我是一个新手,我可能做了很多错事,因此,我真的需要你的专业知识和帮助!
我正在创建一个使用AVFoundation Framework的音乐应用程序.当我在我的Macbook和iOS设备上测试时,它在开始时实际上运行良好.但是在我按下50-100次不同的音频播放按钮后,它会随机停止工作.该应用程序不会崩溃,但它不会播放任何声音.我真的不明白为什么,请帮助我.
更新(2013年6月7日):在这里,我现在弄清楚问题是什么,但我不明白...它在调试器中说这个:shm_open失败:"AppleAudioQueue.39.189049"(25)flags = 0x2 errno = 24请尽可能帮助:o!
这是我的代码:
Run Code Online (Sandbox Code Playgroud)[array1 retain];[array1 retain];[array1 retain];
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) 假设我想创建一个临时变量,例如:
指向另一个长寿变量:
__unsafe_unretained UIView *tableHeaderView = self.tableView.tableHeaderView;
Run Code Online (Sandbox Code Playgroud)指向我刚刚创建的对象.
__unsafe_unretained UIView *tableHeaderView = [[UIView alloc] init];
Run Code Online (Sandbox Code Playgroud)这些临时变量不需要保留,因为只要临时变量在范围内,它们指向的对象就可以保证保留正保留计数.那么,我应该声明它们__unsafe_unretained吗?
objective-c retaincount automatic-ref-counting unsafe-unretained
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是1,那么我知道只有线程保持活着的事实我不必担心retainCount可能因某些自动释放等而关闭...
我准备删除它,但它实际上似乎是有道理的.其他对象不必知道我的类正在运行一个线程.其他对象可以安全地retain和release甚至autorelease拥有线程,而不必担心查封了线程,因为它需要自己照顾的对象.
这段代码实际上感觉干净,令我感到惊讶.
我使用NSThread的事实增加了我的对象的保留计数.我的对象是,target并且selector是线程运行的方法.
initWithTarget:选择器:对象:
返回使用给定参数初始化的NSThread对象.
- (id)initWithTarget:(id)目标选择器:(SEL)选择器对象:(id)参数 …
retaincount ×10
objective-c ×9
ios ×5
iphone ×2
alloc ×1
audio ×1
avfoundation ×1
cocoa ×1
init ×1
instruments ×1
nsobject ×1
nsthread ×1
swift ×1