我将旧项目中的一些类复制到我的新项目中.我不得不删除所有release/autorelease语句,但我仍然有一些错误:
NSArray *allContacts = [(__bridge NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook)];
for (int i =0; i < allContacts.count; i++) {
ABRecordRef person = [allContacts objectAtIndex:i];
Run Code Online (Sandbox Code Playgroud)
在第一行我得到Expected identifier.在第三行,我得到implicit conversion of an Objective-C pointer to 'ABRecordRef (aka 'cpmnst void *)' is disallowed with ARC.
任何想法如何解决这一问题?
这是我在iOS上使用ARC的简单代码:
@interface Person : NSObject {
NSObject *objStrong;
NSObject *objWeek;
}
@property(strong) NSObject *objStrong;
//getting error at this line
@property(weak) NSObject *objWeek; //Existing ivar 'objWeek' for _week property 'objWeek' must be _week
@end
@implementation Person
@synthesize objStrong;
@synthesize objWeek;
@end
Run Code Online (Sandbox Code Playgroud)
当我尝试编译时,编译器抱怨_weak属性'objWeek'的现有ivar'objWeek'.为什么这段代码没有正确编译?
- (NSString*)encodeURL:(NSString *)string
{
NSString *newString = (__bridge NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)string, NULL, CFSTR(":/?#[]@!$ &'()*+,;=\"<>%{}|\\^~`"), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));
if (newString)
{
return newString; // <-- potential leak here
}
return @"";
}
Run Code Online (Sandbox Code Playgroud)
我不熟悉CFTypes(除了知道它们是什么).这是我从互联网上得到的代码,并且不得不努力使其在ARC中运行.我有潜在的泄漏警告,我不知道如何解决它.建议?
是否可以在使用运行时创建的类中添加归零弱引用(在ARC意义上,而不是GC中)实例变量?如果是这样的话?
有一个函数调用class_setWeakIvarLayout()似乎与此相关,但遗憾的是文档(对于此函数和非弱对应函数)都非常薄.
weak-references objective-c objective-c-runtime automatic-ref-counting
我AFNetworking在我的项目中使用,但它有2个警告:

完整的警告字符串是:
/AFNetworking/AFHTTPClient.m:575:38: Capturing 'operation' strongly in this block is likely to lead to a retain cycle
CFArrayRef refAllPeople = ABAddressBookCopyArrayOfAllPeople( addressBook );
NSArray * arPeople = (__bridge_transfer NSArray*)(refAllPeople);
Run Code Online (Sandbox Code Playgroud)
当我分析它说潜在的内存泄漏.
让我试着去理解.refAllPeople有1个参考计数.
然后我做_ bridge _transfer.这将所有权转移给了我.更确切地说,它有arPeople指向它并将保留计数加1.然后保留计数减1,因为_ bridge _transfer等效于(__bridge)后跟CFRelease.
所以,
为什么内存泄漏投诉?
我在Xcode(Allocations)中使用分析工具发现的是,当你淘汰一个属性时,它不会被解除分配,直到父类被填空.现在让我们假设您要确保不在内存中保留昂贵的模态视图控制器(假设它不会经常使用),如果昂贵的VC是属性,则该属性的已分配内存不会当属性被填空时释放,这意味着当用户想再次使用昂贵的VC时,我们每次都会分配相同数量的内存.由于图表不断攀升,因此很容易在剖析器中发现.
但是,如果我只将昂贵的VC定义为实例变量并定义我自己的setter和getter,那么当变量被填空时,分析器分配图实际上会立即减少,并且在每次新分配时返回相同的量.
所以我的问题是,为什么变量'似乎'在被定义为实例变量时被释放,但在定义为属性时却没有?
// What I call defining something as an instance variable:
@interface SomeViewController ()
{
UIPopoverController *somePopover;
}
// What I call defining something as a property
@property (nonatomic,strong) UIPopoverController *somePopover;
// Nilling out a property which does not get allocated unless it does not have a parent (root node memory graph wise)
self.somePopover = nil;
// Nilling out an instance variable which does make the memory graph in the profiler go down by the same amount it …Run Code Online (Sandbox Code Playgroud) 我正在尝试调试我最近转换为使用ARC的项目.我很难确定为什么对象没有被释放并留在内存中(是否有一种简单的方法可以查看哪个引用将对象保存在内存中?)
通知中心链接似乎存在一个问题.在viewDidLoad上我注册了三个通知:
[notificationCenter addObserverForName: kAudioPlaybackStart
object: nil
queue:[NSOperationQueue mainQueue]
usingBlock:^(NSNotification *note) {
[self handle_PlaybackStateStart:nil];
}];
[notificationCenter addObserverForName: kAudioPlaybackStop
object: nil
queue:[NSOperationQueue mainQueue]
usingBlock:^(NSNotification *note) {
[self handle_PlaybackStateStop:nil];
}];
[notificationCenter addObserverForName: kAudioPlaybackPause
object: nil
queue:[NSOperationQueue mainQueue]
usingBlock:^(NSNotification *note) {
[self handle_PlaybackStatePause:nil];
}];
Run Code Online (Sandbox Code Playgroud)
然后,当viewController完成后,我调用一个函数unLoad:
- (void) unLoad {
[[NSNotificationCenter defaultCenter] removeObserver:self];
_mediaPlayerHelper = nil;
_article = nil;
_tableView = nil;
}
Run Code Online (Sandbox Code Playgroud)
我有一个单独的函数的原因是除非释放所有对象,否则不会调用viewDidUnload,所以我需要一些东西来释放它们.目前我在viewDidDisappear上调用它们.
但是,在注释掉观察者时,代码工作正常(并且查看卸载),但是观察者看起来它似乎不起作用并且视图保留在内存中.有什么建议?
iphone objective-c nsnotificationcenter ios automatic-ref-counting
我的项目启用了ARC.我有一个类是NSObject的直接子类,我的类有一个NSArray(强引用).我怎样才能发布我的阵列?
我的理解
在ARC中无需释放物体
在dealloc方法中将nil设置为我的NSArray(强引用)
- 在viewDidUnload视图控制器中将nil设置为我的NSArray(强引用)
这是释放我的NSArray的正确方法吗?如果不是那么正确的方法是什么?
我将保持这个简短明了:我有一个对象的dealloc方法被调用.我还每3秒调用一次NSTimer来记录控制所述对象的当前保留计数.
需要明确的是:我知道NSTimer将保留该对象.即使考虑到这一点,情况仍然没有加起来.
无论如何 - 在这个计时器触发时,对象的保留计数被记录为3.这让我感到困惑有两个原因:
任何帮助是极大的赞赏.谢谢.
编辑:代码:
[NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(logRetainCount) userInfo:nil repeats:YES];
Run Code Online (Sandbox Code Playgroud)
^在viewDidLoad中设置
- (void)logRetainCount
{
NSLog(@"own retain count: %ld", CFGetRetainCount((__bridge CFTypeRef)self));
}
Run Code Online (Sandbox Code Playgroud)
^日志保留计数的方法
- (void)dealloc {
NSLog(@"view controller deallocated");
}
Run Code Online (Sandbox Code Playgroud)
^ dealloc方法在VC中实现,应该被解除分配
和控制台输出:
自己保留计数:5
视图控制器已取消分配
自己保留计数:3