相关疑难解决方法(0)

尽管故意过度释放,但物体的保留计数从未低于1

我正在检查一些对象的保留计数

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.

如果我错了,有人可以确认或纠正我吗?

cocoa memory-management objective-c retaincount

2
推荐指数
2
解决办法
630
查看次数

使用retainCount的奇怪行为

当我使用NSArrayNSString对象记录保留计数时,我的行为不均匀. 请参阅下面的代码,

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

iphone objective-c retaincount

2
推荐指数
2
解决办法
623
查看次数

自动引用计数(ARC)和retainCount

我正在将我的项目转换为使用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

2
推荐指数
1
解决办法
2610
查看次数

Iphone发布问题

我在.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

问题是什么?

谢谢

iphone memory-management

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

什么时候保留计数自动释放的对象减少?

如果我有一个自动释放的对象,它的保留计数何时(即当我调用方法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.

objective-c autorelease retain

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

Iphone应用程序在iOS 4.3中因EXC_BAD_ACCESS错误而崩溃,但在以前的版本中运行正常

我创建了一个苹果批准的应用程序,目前可以在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)

iphone uitableview ios

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

Core Date属性的setter如何管理内存?

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的行为与标题中描述的不一样? …

iphone core-data objective-c

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

UIViewController保留计数问题

我正在使用以下代码创建一个新的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播放的效果).

iphone objective-c ios

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

奇怪保留新创建的字符串对象的计数

这是我的代码

#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.这里有什么问题?

objective-c

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

iOS 7中引用计数的更改?

我正在努力修复一些未使用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行为以这种方式改变的任何文档?

xcode reference-counting objective-c ios ios7

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