标签: automatic-ref-counting

重用代码时出现预期的标识符和ARC问题

我将旧项目中的一些类复制到我的新项目中.我不得不删除所有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.

任何想法如何解决这一问题?

objective-c xcode4.2 automatic-ref-counting

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

为什么这段代码给我一个关于弱属性的错误?

这是我在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'.为什么这段代码没有正确编译?

iphone objective-c ios automatic-ref-counting

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

ios阻止了潜在的内存泄漏

- (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中运行.我有潜在的泄漏警告,我不知道如何解决它.建议?

memory-management ios automatic-ref-counting cftypes

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

使用运行时将弱ivar添加到Objective-C类

是否可以在使用运行时创建的类中添加归零弱引用(在ARC意义上,而不是GC中)实例变量?如果是这样的话?

有一个函数调用class_setWeakIvarLayout()似乎与此相关,但遗憾的是文档(对于此函数和非弱对应函数)都非常薄.

weak-references objective-c objective-c-runtime automatic-ref-counting

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

警告:在此块中强烈捕获$ XXX可能会导致'AFHTTPClient.m'中的保留周期

AFNetworking在我的项目中使用,但它有2个警告: 警告

完整的警告字符串是:

/AFNetworking/AFHTTPClient.m:575:38: Capturing 'operation' strongly in this block is likely to lead to a retain cycle

warnings objective-c automatic-ref-counting afnetworking

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

为什么我必须在__bridge_transfer之后调用CFRelease?

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.

所以,

为什么内存泄漏投诉?

objective-c clang-static-analyzer automatic-ref-counting

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

ARC内存管理:@Property(非原子,强)VS实例变量

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

objective-c ios automatic-ref-counting

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

NotificationCenter观察员阻止了ARC的dealloc

我正在尝试调试我最近转换为使用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

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

在ARC中发布强有力的参考

我的项目启用了ARC.我有一个类是NSObject的直接子类,我的类有一个NSArray(强引用).我怎样才能发布我的阵列?

我的理解

  1. 在ARC中无需释放物体

  2. 在dealloc方法中将nil设置为我的NSArray(强引用)

  3. 在viewDidUnload视图控制器中将nil设置为我的NSArray(强引用)

这是释放我的NSArray的正确方法吗?如果不是那么正确的方法是什么?

memory-management ios automatic-ref-counting

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

是否可以在保留计数不为零的对象上调用dealloc?

我将保持这个简短明了:我有一个对象的dealloc方法被调用.我还每3秒调用一次NSTimer来记录控制所述对象的当前保留计数.

需要明确的是:我知道NSTimer将保留该对象.即使考虑到这一点,情况仍然没有加起来.

无论如何 - 在这个计时器触发时,对象的保留计数被记录为3.这让我感到困惑有两个原因:

  1. 如果对象的保留计数未达到0,为什么要调用dealloc?
  2. 由于dealloc被调用,所以至少,自NSTimer实例保留它以来,保留计数至少应为1?

任何帮助是极大的赞赏.谢谢.

编辑:代码:

[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

objective-c dealloc ios automatic-ref-counting

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