我的理解是,现在设置一个ivar会保留分配给它的对象,因为设置变量默认为strong限定符.因为ivars属于对象的范围,它们被声明并strong保留变量范围内的对象,这意味着当包含ivar的对象仍然存活时,永远不会释放ivars值.
它是否正确?
如果是这样,我是否正确地认为,就记忆管理而言,保留(强)财产和简单的伊娃之间没有区别?
通过Xcode 4.2中引入的新自动引用计数(ARC),我们不再需要在Objective-C中手动管理保留/释放.
这看起来类似于垃圾收集,就像Mac上的Objective-C和其他语言一样.ARC如何与垃圾收集不同?
任何人都可以帮我记住,告诉XCode不使用ARC进行某些文件的标志是什么?我的项目中有几个文件标记为这样......直到我添加了另一个文件并决定将其转换为ARC.听起来很简单吧?我希望我能够简单地检查一下我想要的文件并让XCode做到这一点.好吧,不是那么容易,在预先检查时它从文件中剥离了所有-Noarc标志,现在我需要手动将标志重新应用于多个文件.
这个故事的寓意是:一旦你的项目在ARC中并且你有一些标记为没有ARC的文件,不要从Refactor> Convert to ARC重新运行转换为ARC工具.即使预检失败,它也不会恢复您的设置.
我有一个用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
我们有选择地使用自动布局约束,主要是为了定位与可编辑字段元素相关的标签(通常是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) 我用的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)
这是一个可行的选择吗?我已经看到人们处理这个问题的方法很多,但我还没有看到这个.
假设我们有三个对象:祖父母,父母和孩子.祖父母保留父母,父母保留孩子,孩子保留父母.祖父母释放父母.
在这种情况下会发生什么?
memory-management objective-c ios automatic-ref-counting retain-cycle
一个简单的问题.
如果我有一个属性和一个声明同名的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
今天,我已经将我的xCode更新为4.2版本,而且我想禁用ARC,我也用谷歌搜索.但无法解决我的问题.根据搜索结果,在目标设置中,我找不到'Objective-C自动引用计数'项,因此没有机会将其设置为NO.我逐个找到该项目,并使用搜索字段.
一个人知道最新的Xcode4.2,如何禁用项目的ARC,而不是特定的文件.
非常感谢.
我正在观看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指令之后声明的实例变量.
现在让我感到惊讶的是,实际变量实际上可以在实现文件中声明,而不是静态变量.我的问题如下:
objective-c ×5
ios ×4
ios5 ×3
retain-cycle ×2
autolayout ×1
iphone ×1
ivar ×1
memory-leaks ×1
nstimer ×1
properties ×1
swift ×1
xcode ×1
xcode4.2 ×1