标签: automatic-ref-counting

在ARC中总是将自我的弱引用传递给阻塞?

我对Objective-C中的块使用有点困惑.我目前使用ARC,我的应用程序中有很多块,目前总是指代self而不是弱引用.这可能是这些区块保留self并防止被解除分配的原因吗?问题是,我应该总是使用块中的weak引用self吗?

-(void)handleNewerData:(NSArray *)arr
{
    ProcessOperation *operation =
    [[ProcessOperation alloc] initWithDataToProcess:arr
                                         completion:^(NSMutableArray *rows) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [self updateFeed:arr rows:rows];
        });
    }];
    [dataProcessQueue addOperation:operation];
}
Run Code Online (Sandbox Code Playgroud)

ProcessOperation.h

@interface ProcessOperation : NSOperation
{
    NSMutableArray *dataArr;
    NSMutableArray *rowHeightsArr;
    void (^callback)(NSMutableArray *rows);
}
Run Code Online (Sandbox Code Playgroud)

ProcessOperation.m

-(id)initWithDataToProcess:(NSArray *)data completion:(void (^)(NSMutableArray *rows))cb{

    if(self =[super init]){
        dataArr = [NSMutableArray arrayWithArray:data];
        rowHeightsArr = [NSMutableArray new];
        callback = cb;
    }
    return self;
}

- (void)main {
    @autoreleasepool {
        ...
        callback(rowHeightsArr);
    }
}
Run Code Online (Sandbox Code Playgroud)

iphone weak-references objective-c ios automatic-ref-counting

249
推荐指数
4
解决办法
10万
查看次数

Objective-C中的自动引用计数不会阻止或最小化哪种泄漏?

在Mac和iOS平台上,内存泄漏通常是由未发布的指针引起的.传统上,检查您的分配,副本和保留以确保每个都有相应的发布消息始终是至关重要的.

Xcode 4.2附带的工具链引入了最新版本的LLVM编译器的自动引用计数(ARC),通过让编译器为您的内存管理来完全解决这个问题.这非常酷,它确实减少了大量不必要的,平凡的开发时间,并防止了很多粗心的内存泄漏,这些泄漏很容易通过适当的保留/释放平衡来修复.当您为Mac和iOS应用程序启用ARC时,甚至需要以不同方式管理自动释放池(因为您不应再分配自己的NSAutoreleasePools).

但是,其他的内存泄漏它不能阻止我仍然要注意?

作为奖励,Mac OS X和iOS上的ARC与Mac OS X上的垃圾收集有什么区别?

macos memory-leaks objective-c ios automatic-ref-counting

234
推荐指数
3
解决办法
4万
查看次数

弱引用和无引用引用之间有什么区别?

斯威夫特有:

  • 强引用
  • 弱参考
  • 无主参考文献

无主参考如何与弱参考不同?

什么时候使用无主参考安全?

无主引用是否存在安全风险,如C/C++中的悬空指针

memory-management weak-references automatic-ref-counting dangling-pointer swift

232
推荐指数
4
解决办法
7万
查看次数

在实现API时,如何避免在块中捕获self?

我有一个工作的应用程序,我正在努力将其转换为Xcode 4.2中的ARC.其中一个预检警告涉及self强烈捕获导致保留周期的块.我已经制作了一个简单的代码示例来说明问题.我相信我理解这意味着什么,但我不确定实现这种情况的"正确"或推荐方法.

  • self是MyAPI类的一个实例
  • 下面的代码被简化为仅显示与我的问题相关的对象和块的交互
  • 假设MyAPI从远程源获取数据,MyDataProcessor处理该数据并生成输出
  • 处理器配置有块以通信进度和状态

代码示例:

// code sample
self.delegate = aDelegate;

self.dataProcessor = [[MyDataProcessor alloc] init];

self.dataProcessor.progress = ^(CGFloat percentComplete) {
    [self.delegate myAPI:self isProcessingWithProgress:percentComplete];
};

self.dataProcessor.completion = ^{
    [self.delegate myAPIDidFinish:self];
    self.dataProcessor = nil;
};

// start the processor - processing happens asynchronously and the processor is released in the completion block
[self.dataProcessor startProcessing];
Run Code Online (Sandbox Code Playgroud)

问题:我在做什么"错误"和/或如何修改它以符合ARC惯例?

objective-c ios objective-c-blocks automatic-ref-counting

222
推荐指数
6
解决办法
8万
查看次数

自定义dealloc和ARC(Objective-C)

在我的小iPad应用程序中,我有一个使用观察者的"切换语言"功能.每个视图控制器在其期间向我的观察者注册viewDidLoad:.

- (void)viewDidLoad
{
    [super viewDidLoad];
    [observer registerObject:self];
}
Run Code Online (Sandbox Code Playgroud)

当用户点击"更改语言"按钮时,新语言将存储在我的模型中,并通知观察者并updateUi:在其注册对象上调用选择器.

这非常有效,除了我在TabBarController中有视图控制器.这是因为当标签栏加载时,它会从其子控制器中获取选项卡图标而不初始化视图,因此viewDidLoad:不会调用,因此这些视图控制器不会收到语言更改通知.因此,我将registerObject:调用移到了init方法中.

回来我viewDidLoad:以前和我的观察员一起注册时,我常常viewDidUnload:取消注册.由于我现在正在注册init,因此取消注册是很有意义的dealloc.

但这是我的问题.我写的时候:

- (void) dealloc
{
    [observer unregisterObject:self];
    [super dealloc];
}
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

ARC禁止发送'dealloc'的显式消息

因为我需要打电话[super dealloc]来确保超级班级正常清理,但ARC禁止这样做,我现在卡住了.当我的物体死亡时,还有另一种获取信息的方法吗?

xcode objective-c dealloc ios automatic-ref-counting

207
推荐指数
1
解决办法
7万
查看次数

新的自动引用计数机制如何工作?

有人可以简单地向我解释ARC是如何工作的吗?我知道它与垃圾收集不同,但我只是想知道它是如何工作的.

此外,如果ARC在没有阻碍性能的情况下完成GC的工作,那么为什么Java使用GC?为什么不使用ARC呢?

cocoa-touch garbage-collection objective-c automatic-ref-counting

206
推荐指数
3
解决办法
6万
查看次数

在这个区块中强烈捕获自我可能会导致保留周期

如何在xcode中避免此警告.这是代码片段:

[player(AVPlayer object) addPeriodicTimeObserverForInterval:CMTimeMakeWithSeconds(0.1, 100)
queue:nil usingBlock:^(CMTime time) {
    current+=1;

    if(current==60)
    {
        min+=(current/60);
        current = 0;
    }

    [timerDisp(UILabel) setText:[NSString stringWithFormat:@"%02d:%02d",min,current]];///warning occurs in this line
}];
Run Code Online (Sandbox Code Playgroud)

cocoa-touch objective-c retain avplayer automatic-ref-counting

205
推荐指数
5
解决办法
8万
查看次数

为什么ARC仍然需要@autoreleasepool?

在大多数情况下使用ARC(自动引用计数),我们不需要考虑使用Objective-C对象的内存管理.不允许再创建NSAutoreleasePools,但是有一个新的语法:

@autoreleasepool {
    …
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,当我不应该手动释放/自动释放时,为什么我需要这个呢?


编辑:总结我从所有的答案和评论中得到的简洁:

新语法:

@autoreleasepool { … } 是新的语法

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
…
[pool drain];
Run Code Online (Sandbox Code Playgroud)

更重要的是:

  • ARC使用autorelease以及release.
  • 它需要一个自动释放池才能这样做.
  • ARC不会为您创建自动释放池.然而:
    • 每个Cocoa应用程序的主线程都有一个自动释放池.
  • 有两种情况你可能想要使用@autoreleasepool:
    1. 当您在辅助线程中并且没有自动释放池时,您必须自己制作以防止泄漏,例如myRunLoop(…) { @autoreleasepool { … } return success; }.
    2. 当你想创建一个更本地的游泳池时,正如@mattjgalloway在他的回答中所示.

memory-management objective-c xcode4.2 automatic-ref-counting

191
推荐指数
4
解决办法
7万
查看次数

禁用某些文件的自动引用计数

我已经下载了iOS 5 SDK,发现ARC是新Apple编译器的一个很棒的功能.目前,许多第三方框架不支持ARC.我可以将ARC用于我的新代码并保持当前的保留/释放代码不变吗?ARC转换器在这里不起作用,因为某些框架(例如JSONKit)无法使用转换器转换为ARC.

编辑:

答案是为-fno-objc-arc不希望ARC的文件添加编译器标志.在Xcode 4中,您可以在目标 - > Build Phases - > Compile Sources下执行此操作.

objective-c ios5 automatic-ref-counting

183
推荐指数
3
解决办法
5万
查看次数

如何在Swift中声明一个弱引用数组?

我想在Swift中存储一组弱引用.数组本身不应该是弱引用 - 它的元素应该是.我认为Cocoa NSPointerArray提供了非类型安全版本.

weak-references automatic-ref-counting nspointerarray swift

171
推荐指数
10
解决办法
3万
查看次数