标签: automatic-ref-counting

在ARC时代的财产与ivar

我的理解是,现在设置一个ivar会保留分配给它的对象,因为设置变量默认为strong限定符.因为ivars属于对象的范围,它们被声明并strong保留变量范围内的对象,这意味着当包含ivar的对象仍然存活时,永远不会释放ivars值.

它是否正确?

如果是这样,我是否正确地认为,就记忆管理而言,保留(强)财产和简单的伊娃之间没有区别?

properties objective-c ivar automatic-ref-counting

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

Objective-C自动引用计数和垃圾收集有什么区别?

通过Xcode 4.2中引入的新自动引用计数(ARC),我们不再需要在Objective-C中手动管理保留/释放.

这看起来类似于垃圾收集,就像Mac上的Objective-C和其他语言一样.ARC如何与垃圾收集不同?

iphone garbage-collection ios automatic-ref-counting

55
推荐指数
3
解决办法
2万
查看次数

ios5 ARC什么是从ARC中排除文件的编译器标志?

任何人都可以帮我记住,告诉XCode不使用ARC进行某些文件的标志是什么?我的项目中有几个文件标记为这样......直到我添加了另一个文件并决定将其转换为ARC.听起来很简单吧?我希望我能够简单地检查一下我想要的文件并让XCode做到这一点.好吧,不是那么容易,在预先检查时它从文件中剥离了所有-Noarc标志,现在我需要手动将标志重新应用于多个文件.

这个故事的寓意是:一旦你的项目在ARC中并且你有一些标记为没有ARC的文件,不要从Refactor> Convert to ARC重新运行转换为ARC工具.即使预检失败,它也不会恢复您的设置.

compiler-construction ios5 xcode4.2 automatic-ref-counting

55
推荐指数
1
解决办法
3万
查看次数

当Leaks仪器没有显示时,如何调试内存泄漏?

我有一个用Swift写的iOS应用程序泄漏内存 - 在某些情况下应该释放一些对象,但事实并非如此.我通过简单地添加如下deinit调试消息来了解这个问题:

deinit {
    println("DEINIT: KeysProvider released")
}
Run Code Online (Sandbox Code Playgroud)

因此,在应该导致对象释放的此类事件之后,deinit消息应该存在于控制台中.但是,对于应该释放的某些对象,消息将丢失.仍然,Leaks Developer Tool没有显示任何泄漏.我该如何解决这种情况?

memory-leaks memory-management ios automatic-ref-counting swift

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

AutoLayout:removeFromSuperview/removeConstraints抛出异常并严重崩溃

我们有选择地使用自动布局约束,主要是为了定位与可编辑字段元素相关的标签(通常是UITextView,UITextField).但是,自从为这些字段实现自动布局以来,每当我们卸载视图,解除分配等时,我们都会看到一个令人讨厌的异常并崩溃.异常发生的原因是它试图在卸载视图之前从视图中删除约束.

我们的视图/控制器层次结构如下:

UITableViewController (plain style, but with cell appearance to mimic grouped style)
--> UITableViewCell
----> UIViewController (container for editable form)
------> UICollectionViewController (editable form)
--------> UICollectionViewCell
-----------> UIViewController (editable field)
--------------> UILabel (field label)                   **HAS CONSTRAINTS**
--------------> UITextView / UITextField (field value)  **HAS CONSTRAINTS**
Run Code Online (Sandbox Code Playgroud)

很多时候,当上层表格单元被解除分配/替换/重新加载时,我们会看到一个巨大的异常,然后崩溃,因为它试图释放/卸载其中的视图层次结构.

我试图通过捕获异常(没有帮助)并通过在释放/卸载(in viewWillDisappear:)之前强制删除受影响的视图和所有子视图上的所有约束来缓解崩溃,它似乎没有帮助.我甚至试图逐个删除这些约束,看看是否有一个特别是导致麻烦但是当我们打电话removeConstraint:removeConstraints:在容器上准备消失时它们都会爆炸.

我很困惑!这是我们例外的一小部分 - 大约有3000行被切断了,所以如果你需要更多,请问.

Exception while deallocating view: { Rows:
    0x18911270.posErrorMarker == 4 + 1*0x18911270.negError + 1*0x189112f0.marker + -1*0x189113f0.negError + 1*0x189113f0.posErrorMarker + 1*0x18911a60.marker + -0.5*0x1892dae0.negError + 0.5*0x1892dae0.posErrorMarker + …
Run Code Online (Sandbox Code Playgroud)

ios automatic-ref-counting autolayout

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

对NSTimer目标的弱参考以防止保留周期

我用的NSTimer是这样的:

timer = [NSTimer scheduledTimerWithTimeInterval:30.0f target:self selector:@selector(tick) userInfo:nil repeats:YES];
Run Code Online (Sandbox Code Playgroud)

当然,NSTimer保留了创建保留周期的目标.此外,self不是一个UIViewController所以我没有任何东西viewDidUnload,我可以无效的计时器来打破循环.所以我想知道我是否可以使用弱引用:

__weak id weakSelf = self;
timer = [NSTimer scheduledTimerWithTimeInterval:30.0f target:weakSelf selector:@selector(tick) userInfo:nil repeats:YES];
Run Code Online (Sandbox Code Playgroud)

我听说计时器必须无效(我想从运行循环中释放它).但我们可以在我们的dealloc中做到这一点,对吗?

- (void) dealloc {
    [timer invalidate];
}
Run Code Online (Sandbox Code Playgroud)

这是一个可行的选择吗?我已经看到人们处理这个问题的方法很多,但我还没有看到这个.

objective-c nstimer automatic-ref-counting retain-cycle

52
推荐指数
5
解决办法
2万
查看次数

深入了解保留周期

假设我们有三个对象:祖父母,父母和孩子.祖父母保留父母,父母保留孩子,孩子保留父母.祖父母释放父母.

在这种情况下会发生什么?

memory-management objective-c ios automatic-ref-counting retain-cycle

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

我应该在ARC的init方法中引用self.property吗?

一个简单的问题.

如果我有一个属性和一个声明同名的ivar:

在.h文件中:

(Reminder*)reminder;
@property(nonatomic,strong)(Reminder*)reminder;
Run Code Online (Sandbox Code Playgroud)

在.m文件中,如果我使用ARC,我应该在init方法中使用ivar还是属性?

- (id)initWithReminder:(Reminder*)reminder_ {
    self = [super init];
    if (self) {
        reminder = reminder_;
    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)

或者我应该使用该属性来获得自动引用计数的好处,如下所示:

- (id)initWithReminder:(Reminder*)reminder_ {
    self = [super init];
    if (self) {
        self.reminder = reminder_;
    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)

我不确定在对象的初始化中哪个点可以使用点表示法访问属性.

initialization reference-counting objective-c ios5 automatic-ref-counting

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

如何禁用Xcode4.2自动引用计数

今天,我已经将我的xCode更新为4.2版本,而且我想禁用ARC,我也用谷歌搜索.但无法解决我的问题.根据搜索结果,在目标设置中,我找不到'Objective-C自动引用计数'项,因此没有机会将其设置为NO.我逐个找到该项目,并使用搜索字段.

一个人知道最新的Xcode4.2,如何禁用项目的ARC,而不是特定的文件.

非常感谢.

xcode ios5 automatic-ref-counting

49
推荐指数
1
解决办法
5万
查看次数

在ObjC实现文件中声明的实例变量

我正在观看WWDC ARC介绍视频,在看到一个Apple工程师谈到Stack示例之前,我看到过ObjC中从未见过的东西.

以下代码用于ARC的堆栈示例:

@implementation Stack 
{ 
    // instance variable declared in implementation context
    NSMutableArray *_array; 
}

- (id)init 
{
   if (self = [super init])
      _array = [NSMutableArray array];
   return self;
}

- (void)push:(id)x 
{
   [_array addObject:x];
}

- (id)pop 
{
   id x = [_array lastObject];
   [_array removeLastObject];
   return x;
}

@end
Run Code Online (Sandbox Code Playgroud)

请注意在@implementation指令之后声明的实例变量.

现在让我感到惊讶的是,实际变量实际上可以在实现文件中声明,而不是静态变量.我的问题如下:

  • 这是SDK for iOS 5中引入的一些新构造还是已经可以使用很长时间了?
  • 如果不在对象外部访问实例变量,那么在实现中声明实例变量是不错的做法?它似乎比使用@private指令更清洁.

objective-c automatic-ref-counting

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