与此问题非常相似,我正在尝试将使用ASIHTTPRequest&的项目转换ASIFormDataRequest为ARC.
在我的视图控制器类中,我经常request在完成块中引用和使用对象的属性(查看响应代码,响应数据等):
__block ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:SOME_URL]];
[request setCompletionBlock:^{
if([request responseStatusCode] == 200) ....etc
Run Code Online (Sandbox Code Playgroud)
转换为ARC时,我收到警告:
在此块中强烈捕获"请求"可能会导致保留周期
这样做的正确方法是什么?
另一个SO用户在前一个帖子中指出,简单添加__weak可能会导致请求在块完成之前被释放,我认为这是真的.
如何在ARC下的完成/故障块中正确引用这些属性?
iphone objective-c asihttprequest ios automatic-ref-counting
我知道您可以设置编译器标志-fno-objc-arc以禁用XCODE中编译源中每个文件的自动引用计数(ARC),但是如何在不必每次执行每个文件的情况下对整个文件组执行此操作?
我问的原因是我在我的应用程序中添加了一个大型库,我需要-fno-objc-arc为100多个文件设置编译器标志.
如何避免使用ARC创建对象?
我正在寻找与此相当的ARC(来自内存):
- (id)init
{
if (( self = [super init] )) {
if (!condition) {
[self release];
self = nil;
return self;
}
}
return self;
}
Run Code Online (Sandbox Code Playgroud) 更新:此问题已在Xcode 4.6中修复!
此技术现在再次按预期工作.但是,在您的代码中使用之前,请务必阅读Rob Napier优秀答案顶部的注释.
原始邮政
(ARC,Xcode 4.3.1,iOS 5.1)
我有一个CF类型(CGImage)的强大属性,我希望由ARC自动管理__attribute__((NSObject))(如在合成的setter中保留和释放,并且它在dealloc中没有),但是它不起作用:分配属性时不保留对象.
重现的最小例子:
@interface TestClass : NSObject
@property (nonatomic, strong) __attribute__((NSObject)) CFStringRef str;
@end
// ...In some function
CFStringRef str = (__bridge CFStringRef)[NSString stringWithFormat:@"%g", 2.5];
NSLog(@"%ld", CFGetRetainCount(str));
TestClass *obj = [[TestClass alloc] init];
obj.str = str;
NSLog(@"%ld", CFGetRetainCount(str));
Run Code Online (Sandbox Code Playgroud)
其中两次打印"1".
现在奇怪的是(虽然我不确定)我认为它在我更新到iOS 5.1和Xcode 4.3.1(来自iOS 5和Xcode 4.2)之前正常工作,并且它从gdb切换到lldb.未升级(或知道如何更改编译器)的人可能会确认吗?
是否有一种机制可以让对象知道归零弱引用变为零?
例如,我有一个属性
@property (nonatomic, weak) MyClass *theObject;
Run Code Online (Sandbox Code Playgroud)
当对象解除分配并且属性变为零时,我希望得到通知.但是怎么样?当对象消失时,归零弱参考系统是否使用setter将属性设置为nil?
我用块做了好几次,就像我有强烈参考的指针一样
我听说你应该使用copy,但是使用块作为指针而不是原始对象的含义是什么?
我从来没有得到编译器的抱怨,我不应该使用
@property (nonatomic, strong) MyBlock block;
Run Code Online (Sandbox Code Playgroud)
但应该使用
@property (nonatomic, copy) MyBlock block;
Run Code Online (Sandbox Code Playgroud)
据我所知,块只是一个对象,所以为什么还要复制?
我们是否需要在UIAnimation块中使用__weak self,如下所示?如果我们不指定自我弱,是否会产生保留周期问题?
[UIView animateWithDuration:animationDuration
delay:0
options:UIViewAnimationCurveEaseInOut
animations:^{
[self doSomething];
} completion:^(BOOL finished) {
if (finished) {
[self doSomething];
}
}];
Run Code Online (Sandbox Code Playgroud)
我也对以下场景感到困惑.有什么想法吗?请分享您的意见.
[self.navController dismissViewControllerAnimated:animated
completion:^{
[self doSomething];
}];
Run Code Online (Sandbox Code Playgroud)
我们应该在这里使用弱者吗?
在Clang的Objective-C自动参考计数中,我们看到以下内容
对于__weak对象,左值更新为指向新的指针,除非新指针是当前正在进行解除分配的对象,在这种情况下,左值更新为空指针.这必须相对于对象的其他赋值,从对象读取以及新指针的最终版本以原子方式执行.
在objc-weak.mm中,我们看到以下代码块weak_register_no_lock():
if (deallocating) {
if (crashIfDeallocating) {
_objc_fatal("Cannot form weak reference to instance (%p) of "
"class %s. It is possible that this object was "
"over-released, or is in the process of deallocation.",
(void*)referent, object_getClassName((id)referent));
} else {
return nil;
}
}
Run Code Online (Sandbox Code Playgroud)
我在我的UIViewController子类dealloc方法中设置了一个断点,并尝试[self allowsWeakReference]在lldb中调用,从而产生了NO值.
如果我们尝试将self设置为另一个对象的weak属性,则应用程序将根据objc-weak.mm代码崩溃.
问题是 - 为什么会发生这种情况?铿锵的规格是错的吗?这是objc实现中的一个错误吗?
这是一段简单的代码,可以重现崩溃:
//cc -fmodules -fobjc-arc -g crash.m -o crash
@import Foundation;
@interface Foo : NSObject
@end
@implementation Foo …Run Code Online (Sandbox Code Playgroud) weak-references objective-c clang dealloc automatic-ref-counting
我创建了一个@property的UIColor,
@property (nonatomic) UIColor *color;
Run Code Online (Sandbox Code Playgroud)
然后我试着合成它:
@synthesize color = _color;
Run Code Online (Sandbox Code Playgroud)
但是我收到一个错误:
ARC禁止使用未指定的所有权或存储属性合成Objective-C对象的属性
那是什么意思?
我所要做的就是为一个UIColor改变颜色的对象创建一个属性.
memory-management compiler-errors properties objective-c automatic-ref-counting
每:
@IBOutlet weak var nameLabel: UILabel!
Run Code Online (Sandbox Code Playgroud)
每当我声明我的IBOutlets时,我只使用var而不是weak var.但我最近遇到了一些使用弱var的代码模板.他们为什么这样做?还有什么好处?
为什么在UILabel结束时会有一个爆炸操作员.我知道这是必需的,我和它一起去,但现在就问它.
提前致谢.
objective-c ×8
ios ×5
iphone ×2
clang ×1
cocoa ×1
dealloc ×1
iboutlet ×1
operators ×1
properties ×1
retain-cycle ×1
swift ×1
xcode ×1