我正在检查一些对象的保留计数
NSLog(@"r = %d", [aObject retainCount];
Run Code Online (Sandbox Code Playgroud)
似乎我能得到的最低值是"r = 1",即使我故意添加额外的"释放"调用
[aObject release];
Run Code Online (Sandbox Code Playgroud)
即使我尝试将"释放"和"NSLog"测试代码放在对象的dealloc 方法中,"r = 1"限制仍然 有效.
Cocoa运行时似乎忽略了我的额外版本,直到"r = 1",然后在示例程序的最后使用"EXC_BAD_ACCESS"崩溃(没有GC).
我唯一的解释(猜测)是我们需要r> = 1来访问对象.并且Cocoa运行时只是试图避免让任何对象的保留计数过早地变为0.
如果我错了,有人可以确认或纠正我吗?
当我使用NSArray和NSString对象记录保留计数时,我的行为不均匀.
请参阅下面的代码,
NSArray *aryTemp = [NSArray arrayWithObjects:@"One",nil];
NSLog(@"Retain Count :%d",[aryTemp retainCount]);
NSArray *aryTemp2 = [[NSArray alloc] initWithObjects:@"One",nil];
NSLog(@"Retain Count :%d",[aryTemp2 retainCount]);
NSString *strTemp = @"One";
NSLog(@"Retain Count :%d",[strTemp retainCount]);
NSString *strTemp2 = [[NSString alloc] initWithString:@"One"];
NSLog(@"Retain Count :%d",[strTemp2 retainCount]);
Run Code Online (Sandbox Code Playgroud)
这是我得到的输出
2011-03-01 19:19:32.410 Test[14607:207] Retain Count :37
2011-03-01 19:19:32.412 Test[14607:207] Retain Count :1
2011-03-01 19:19:32.413 Test[14607:207] Retain Count :2147483647
2011-03-01 19:19:32.413 Test[14607:207] Retain Count :2147483647
Run Code Online (Sandbox Code Playgroud)
代码有什么问题?
谢谢
Pratik Goswami
我正在将我的项目转换为使用ARC,并遇到了一个特殊问题.我有一个类来管理从网络下载的文件缓存.每个文件都存储在iPhone文件系统中,相关对象保存在我的管理器类中.其他想要使用文件的对象,请求我的经理获取缓存对象,并在需要该文件时保留该文件.
但偶尔,经理会清理缓存,删除旧文件.当然,它不应该删除当时正在使用的文件.在ARC之前,我通过使用关联对象的retainCount检测到:
// if retainCount is 1 then only the cache has a reference to it
if( obj.retainCount <= 1 ) {
[obj deleteFile];
[cache removeObject:obj];
}
Run Code Online (Sandbox Code Playgroud)
这完全有效[是的,我知道有关retainCount不可靠的警告,但根据我的经验,如果retainCount> 1,你肯定知道不止一个对象保留了它]
但是,使用ARC时,不允许再使用retainCount.我可以引入自己的保留计数机制,并要求所有使用文件的对象明确保留和释放文件对象.但那是错误的,而且这正是ARC应该解决的问题.
你知道更好的方法来实现同样的目标吗?
cocoa-touch objective-c retaincount ios5 automatic-ref-counting
我在.h中有以下代码
@property (nonatomic, copy) NSString *username;
Run Code Online (Sandbox Code Playgroud)
然后,当用户在TextField中输入文本时,以这种方式分配用户名:
self.username = textField.text;
Run Code Online (Sandbox Code Playgroud)
然后,在dealloc方法中我调用release:
NSLog(@"%d",[username retainCount]);
[username release];
NSLog(@"%d",[username retainCount]);
Run Code Online (Sandbox Code Playgroud)
但在控制台中它打印:
2011-01-11 23:09:52.468 IApp [2527:307] 1
2011-01-11 23:09:52.480 IApp [2527:307] 1
问题是什么?
谢谢
如果我有一个自动释放的对象,它的保留计数何时(即当我调用方法retainCount时返回的值)会减少?我认为它是在对象分配的方法范围内结束时,但我的测试并没有表明这一点.我有以下代码:
int itemIndex = 0;
NSArray* items = [mResponse componentsSeparatedByString:@","];
self.mText = (NSString*)[items objectAtIndex:itemIndex++];
self.mText = [mText gtm_stringByUnescapingFromURLArgument];
NSLog(@"retain count: %d",[mText retainCount]);
Run Code Online (Sandbox Code Playgroud)
这为计数返回2(mText有一个保留属性,这是有意义的),退出此方法后,来自外部的调用同样返回2.
我创建了一个苹果批准的应用程序,目前可以在appstore中购买.但是在4.3更新之后,当使用EXC_BAD_ACCESS错误滚动UITableView时它会崩溃.NSZombieEnabled = YES,将使应用程序再次运行,但这当然不是解决方案;)在以下行的Main类中报告错误:
int retVal = UIApplicationMain(argc, argv, nil, nil);
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪也无法帮助我:
> #0 0x00faf09f in objc_msgSend ()
> #1 0x04c7b9e0 in ?? ()
> #2 0x00d6004c in CFRelease ()
> #3 0x00e42369 in -[__NSArrayM removeObjectAtIndex:] ()
> #4 0x00e3dcfc in -[NSMutableArray removeObjectsInRange:] ()
> #5 0x003507a5 in -[UITableView(_UITableViewPrivate) _updateVisibleCellsNow:] ()
> #6 0x0034890c in -[UITableView layoutSubviews] ()
> #7 0x01d80a5a in -[CALayer layoutSublayers] ()
> #8 0x01d82ddc in CALayerLayoutIfNeeded ()
> #9 0x01d280b4 in CA::Context::commit_transaction ()
> #10 0x01d29294 in …Run Code Online (Sandbox Code Playgroud) CoreData属性的setter是否保留?或复制价值或什么是二传手?我想知道是否必须(自动)释放我放入setter的值.
我已经做了一些快速测试.假设以下型号:
+----------+
| Class A |
+----------+
| v :int32 |
+----------+
Run Code Online (Sandbox Code Playgroud)
生成的ManagedObject然后如下所示:
//A.h
@interface A : NSManagedObject
{
}
@property (nonatomic, retain) NSNumber * v;
//...
//A.m
@implementation A
@dynamic v;
...
Run Code Online (Sandbox Code Playgroud)
好的,属性标记为retain,因此如果我将NSNumber设置为v,则应保留NSNumber.但它不是(我认为).我做了以下事情:
A *a = ... ;
NSNumber *retainCheck = [[NSNumber alloc] initWithInt:23];
NSLog(@"retainCheck1: %i",[retainCheck retainCount]);
a.v = retainCheck;
NSLog(@"retainCheck2: %i",[retainCheck retainCount]);
NSLog(@"retainCheck3: %i",[a.v retainCount]);
NSLog(@"pointer1: %#x",retainCheck);
NSLog(@"pointer2: %#x",a.v);
Run Code Online (Sandbox Code Playgroud)
这会产生以下输出:
retainCheck1: 1
retainCheck2: 1
retainCheck3: 1
pointer1: 0x62f068
pointer2: 0x62f068
Run Code Online (Sandbox Code Playgroud)
两个NSNumber都是相同的NSNumber实例(相同的指针值 - >所以它没有复制或类似的那样),并且设置器似乎不保留NSNumber.
我做的...... 我的测试错了吗?或者NSManagedObject-setters的行为与标题中描述的不一样? …
我正在使用以下代码创建一个新的UIViewController
GameViewController *temp = [[GameViewController alloc] initWithNibName:@"GameViewController" bundle:nil];
NSLog(@"retain count%d", [temp retainCount]);
temp.backgroundMusic = backgroundMusic;
self.gameView = temp;
[temp release];
[self presentModalViewController:gameView animated:YES];
[gameView release];
Run Code Online (Sandbox Code Playgroud)
但是当我查看保留计数时,我的临时视图控制器返回4.
怎么可能?因为它是4,当我解除视图控制器时,我无法将其从内存中删除,我的游戏正在继续播放.(我可以看到AI播放的效果).
这是我的代码
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString *str = [[NSString alloc]initWithString:@"This is string object"];
NSLog(@"%lu", [str retainCount]);
[pool drain];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我期望输出为1因为它是新创建的对象,但结果是1152921504606846.这里有什么问题?
我正在努力修复一些未使用ARC构建的遗留应用程序上的iOS 7显示问题,并且dealloc在iOS版本6和7之间的方法遇到了一些不一致的行为.我找不到任何其他提及这些任何文件或社区讨论的变化,所以我想知道这里是否有人可以了解这里发生的事情?
我以前的代码(在iOS6中工作,看起来像这样):
@interface MyViewController()
@property (retain) AdHandler *adHandler;
@end
@implementation MyViewController
@synthesize adHandler = _adHandler;
- (id) initWithAdHandler:(AdHandler*)anAdHandler
{
self = [super init];
_adHandler = [anAdHandler retain];
return self;
}
- (void)dealloc
{
[super dealloc];
[_adHandler release];
_adHandler = nil;
}
...
@end
Run Code Online (Sandbox Code Playgroud)
当通过在iOS 6中单步调试代码,我发现后dealloc声明中,[_adHandler retainCount]仍然是积极的,而对象仍然是可用的.
然而,在iOS 7中,在dealloc语句之后,retainCount以某种方式命中零,并且_adHandler对象已经dealloc'd,因此我的调用release导致了EXC_BAD_ACCESS.
我可以通过在[adHandler release]通话前移动我的电话来解决这个dealloc问题,但我的问题是为什么会发生这种情况?为什么dealloc发布它不负责的对象?有没有关于为什么dealloc行为以这种方式改变的任何文档?
objective-c ×8
iphone ×5
ios ×3
retaincount ×3
autorelease ×1
cocoa ×1
cocoa-touch ×1
core-data ×1
ios5 ×1
ios7 ×1
retain ×1
uitableview ×1
xcode ×1