Questions tagged «automatic-ref-counting»

自动引用计数(ARC)是一种编译器功能,可提供对Objective-C和Swift对象的自动内存管理。


19
performSelector可能会导致泄漏,因为其选择器未知
ARC编译器收到以下警告: "performSelector may cause a leak because its selector is unknown". 这是我在做什么: [_controller performSelector:NSSelectorFromString(@"someMethod")]; 为什么会收到此警告?我知道编译器无法检查选择器是否存在,但是为什么会导致泄漏?以及如何更改我的代码,以便不再收到此警告?

11
在ARC下,IBOutlets应该强还是弱?
我正在使用ARC专为iOS 5开发。是否应IBOutlets到UIViewS(和子类)是strong或weak? 以下: @property (nonatomic, weak) IBOutlet UIButton *button; 将摆脱所有这些: - (void)viewDidUnload { // ... self.button = nil; // ... } 这样做有什么问题吗?strong从“接口生成器”编辑器直接连接到标题时,模板使用的是自动生成的属性,但是为什么?在UIViewController已经有一个strong到其基准view保留其子视图。

9
我们是否应该在Swift的闭包内部始终使用[unown self]
在WWDC 2014会议403 Intermediate Swift和transcript中,有以下幻灯片 演讲者说,在这种情况下,如果我们不在[unowned self]那里使用它,将会导致内存泄漏。这是否意味着我们应该始终使用[unowned self]内部闭包? 在Swift Weather应用程序的ViewController.swift的第64行,我没有使用[unowned self]。但是我通过使用@IBOutlet诸如self.temperature和来更新UI self.loadingIndicator。可能没问题,因为@IBOutlet我定义的全部都是weak。但是为了安全起见,我们应该一直使用[unowned self]吗? class TempNotifier { var onChange: (Int) -> Void = {_ in } var currentTemp = 72 init() { onChange = { [unowned self] temp in self.currentTemp = temp } } }

8
Objective-C ARC:强vs保留,弱vs分配
ARC strong和引入了两个新的内存管理属性weak。 除了copy,这显然是完全不同的,vs 和vs 之间是否有任何区别?strongretainweakassign 根据我的理解,这里唯一的区别是weak将分配nil给指针,而不会分配给指针,assign这意味着一旦释放指针后,我将消息发送给指针,程序就会崩溃。但是,如果我使用weak,这将永远不会发生,因为发送至的消息nil将无济于事。 我不知道strong和之间的任何区别retain。 是否有任何理由为什么我应该使用assign,并retain在新的项目,或者是那种被弃用?


2
苹果为什么建议使用dispatch_once在ARC下实现单例模式?
在ARC下单例的共享实例访问器中使用dispatch_once的确切原因是什么? + (MyClass *)sharedInstance { // Static local predicate must be initialized to 0 static MyClass *sharedInstance = nil; static dispatch_once_t onceToken = 0; dispatch_once(&onceToken, ^{ sharedInstance = [[MyClass alloc] init]; // Do any other initialisation stuff here }); return sharedInstance; } 在后台异步实例化单例不是一个坏主意吗?我的意思是,如果我请求该共享实例并立即依赖它,那会发生什么,但是dispatch_once直到圣诞节才创建我的对象?它不会立即返回,对吗?至少这似乎是Grand Central Dispatch的重点。 那他们为什么要这样做呢?


10
语义问题:属性的合成吸气剂遵循可可命名约定返回“拥有的”对象
我目前正在使用iOS 5 SDK尝试开发我的应用。我正在尝试将NSString设置为属性,然后在.m文件中对其进行合成(我之前做过但没有任何问题)。现在,我遇到了这样一个问题:“语义问题:属性的合成吸气剂遵循可可命名约定来返回“拥有的”对象。” 这是我的代码:.h @interface ViewController : UIViewController { NSString *newTitle; } @property (strong, nonatomic) NSString *newTitle; .m @synthesize newTitle; 有人知道我该如何解决吗?谢谢!!

8
将项目转换为使用ARC时,“开关盒在保护范围内”是什么意思?
将项目转换为使用ARC时,“开关盒在受保护的范围内”是什么意思?我正在使用Xcode 4编辑->重构->转换为Objective-C ARC,将项目转换为使用ARC ...我得到的错误之一是在“某些”开关中出现“开关大小写在保护范围内”开关盒。 编辑,这是代码: 在“默认”情况下标记为ERROR: - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @""; UITableViewCell *cell ; switch (tableView.tag) { case 1: CellIdentifier = @"CellAuthor"; cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; } cell.textLabel.text = [[prefQueries objectAtIndex:[indexPath row]] …

6
总是在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]; } ProcessOperation.h @interface ProcessOperation : NSOperation { NSMutableArray *dataArr; NSMutableArray *rowHeightsArr; void (^callback)(NSMutableArray *rows); } 流程操作 -(id)initWithDataToProcess:(NSArray *)data completion:(void (^)(NSMutableArray *rows))cb{ if(self =[super init]){ dataArr = [NSMutableArray arrayWithArray:data]; …


5
Objective-C中的自动引用计数不会阻止或减少哪种泄漏?
在Mac和iOS平台中,内存泄漏通常是由未释放的指针引起的。传统上,检查您的分配,复制和保留以确保每个都有相应的释放消息一直是最重要的。 Xcode 4.2随附的工具链在最新版本的LLVM编译器中引入了自动引用计数(ARC),通过使编译器为您的内容进行内存管理,从而完全解决了此问题。这很酷,并且确实减少了很多不必要的,平凡的开发时间,并防止了许多粗心大意的内存泄漏,这些泄漏很容易通过适当的保留/释放平衡来解决。当为Mac和iOS应用程序启用ARC时,甚至需要对自动释放池进行不同的管理(因为您NSAutoreleasePool不再应该分配自己的s)。 但是,其他的内存泄漏它不能阻止我仍然要注意? 另外,Mac OS X和iOS上的ARC与Mac OS X上的垃圾回收之间有什么区别?

8
实施API时如何避免在块中捕获自我?
我有一个正在运行的应用程序,正在将其转换为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 …

1
自定义dealloc和ARC(Objective-C)
在我的小iPad应用程序中,我具有使用观察者的“切换语言”功能。每个视图控制器在其运行期间向我的观察者注册viewDidLoad:。 - (void)viewDidLoad { [super viewDidLoad]; [observer registerObject:self]; } 当用户单击“更改语言”按钮时,新语言将存储在我的模型中,并通知观察者并调用updateUi:其已注册对象上的选择器。 这非常有效,除了在TabBarController中具有视图控制器时。这是因为在加载选项卡栏时,它会从其子控制器中获取选项卡图标,而无需初始化视图,因此viewDidLoad:不会调用它,因此这些视图控制器不会收到语言更改通知。因此,我将registerObject:调用移到了init方法中。 回到我以前viewDidLoad:向观察员注册时,我曾经viewDidUnload:注销过。由于我现在正在注册init,因此取消注册非常有道理dealloc。 但是,这是我的问题。当我写: - (void) dealloc { [observer unregisterObject:self]; [super dealloc]; } 我收到此错误: ARC禁止显式发送消息“ dealloc” 由于我需要致电[super dealloc]以确保正确清理超类,但是ARC禁止这样做,所以我现在陷入困境。当我的物体快要死时,还有另一种方法来通知我吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.