在Xcode 4.2中使用自动引用计数(ARC)时,如何转换(或创建)编译和行为正确的单例类?
有了ARC,我不能再投CGColorRef给id.我了解到我需要做一个桥接演员.据clang docs说:
一个桥接投是C样式转换标注有三个关键字之一:
(__bridge T) op将操作数强制转换为目标类型T.如果T是可保留对象指针类型,则op必须具有不可保留的指针类型.如果T是不可保留的指针类型,则op必须具有可保留的对象指针类型.否则演员阵容不合理.没有所有权转让,ARC不会保留任何保留操作.
(__bridge_retained T) op将必须具有可保留对象指针类型的操作数强制转换为目标类型,该目标类型必须是不可保留的指针类型.ARC保留该值,取决于对本地值的通常优化,并且接收方负责平衡+1.
(__bridge_transfer T) op将操作数(必须具有不可保留的指针类型)强制转换为目标类型,该目标类型必须是可保留的对象指针类型.ARC将在封闭的完整表达式的末尾释放值,这取决于对本地值的通常优化.为了将对象传入和传出ARC控制,需要这些演员表; 请参阅有关可保留对象指针转换一节的基本原理.
纯粹使用
__bridge_retained或__bridge_transfer铸造来说服ARC分别发出不平衡的保留或释放,这种形式很差.
我会在什么样的情况下使用它们?
例如,CAGradientLayer有一个colors接受CGColorRefs 数组的属性.我的猜测是我应该__brige在这里使用,但究竟为什么我应该(或不应该)不清楚.
在启用ARC的代码中,如何在使用基于块的API时修复有关潜在保留周期的警告?
警告:
Capturing 'request' strongly in this block is likely to lead to a retain cycle
由这段代码生成:
ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:...
[request setCompletionBlock:^{
NSDictionary *jsonDictionary = [[CJSONDeserializer deserializer] deserialize:request.rawResponseData error:nil];
// ...
}];
Run Code Online (Sandbox Code Playgroud)
警告与request块内对象的使用相关联.
cocoa cocoa-touch retain asihttprequest automatic-ref-counting
我正在开发一款适用于iPad的应用程序.iOS 4.2开始开发,现在继续(我认为将完成)iOS 4.3.我刚刚阅读了iOS 5中的ARC,基本上我明白我们将永远不再需要发布和保留对象.我的问题是:
如果我决定升级到iOS 5,我是否需要从代码中删除所有[myObject retain]和[myObject release]语句?
如果我使用ARC开发适用于iOS 5的新应用程序,我是否需要实施某种"复古兼容性"检查?即:我需要检查iOS版本并相应地调用retain和release吗?那么,基本上,ARC适用于所有iOS版本还是适用于iOS 5?
我正在尝试学习iOS 5中的自动引用计数.现在这个问题的第一部分应该很简单:
它是正确的,我不使用ARC时需要写在我的dealloc明确释放属性声明?换句话说,这是真的,以下就不是需要一个明确的dealloc的?
@interface MyClass : NSObject
@property (strong, nonatomic) NSObject* myProperty;
@end
@implementation MyClass
@synthesize myProperty;
@end
Run Code Online (Sandbox Code Playgroud)我的下一个也是更重要的问题来自" 转换为ARC发行说明"文档中的一行:
您不必(实际上不能)释放实例变量,但您可能需要在系统类和其他未使用ARC编译的代码上调用[self setDelegate:nil].
这引出了一个问题:我怎么知道哪些系统类没有用ARC编译?我什么时候应该创建自己的dealloc并明确地将强保留属性设置为nil?我应该假设属性中使用的所有NS和UI框架类都需要显式的deallocs吗?
在使用手动参考跟踪时,有关SO和其他地方有关释放财产支持ivar的做法的大量信息,但在使用ARC时相对较少.
我正在将一个代码块从iOS4项目移植到iOS5,我遇到了一些ARC问题.该代码从屏幕截图生成PDF.
PDF生成代码
UIView *captureView;
...
NSMutableData *pdfData = [NSMutableData data];
UIGraphicsBeginPDFContextToData(pdfData, captureView.bounds, nil);
UIGraphicsBeginPDFPage();
CGContextRef pdfContext = UIGraphicsGetCurrentContext();
[captureView.layer renderInContext:pdfContext];
UIGraphicsEndPDFContext();Run Code Online (Sandbox Code Playgroud)
renderInContext行
[captureView.layer renderInContext:pdfContext];Run Code Online (Sandbox Code Playgroud)
生成以下错误.
Automatic Reference Counting issue
Receiver type 'CALayer' for instance message is a forward declarationRun Code Online (Sandbox Code Playgroud)
有什么想法在这里发生了什么?
core-animation objective-c calayer ios automatic-ref-counting
我正在努力完成这个难题.
__strong是所有Objective-C可保留对象指针的默认值,如NSObject,NSString等.这是一个强大的参考.ARC -release在范围的末尾与a平衡.
__unsafe_unretained等于旧的方式.它用于弱指针而不保留可保留对象.
__weak就像__unsafe_unretained不同之处在于它是一个自动归零弱引用这意味着该指针将零一旦引用的对象被释放被设置为.这消除了悬空指针和EXC_BAD_ACCESS错误的危险.
但到底有什么__autoreleasing好处呢?我很难找到关于何时需要使用此限定符的实际示例.我相信它只适用于期望指针指针的函数和方法,例如:
- (BOOL)save:(NSError**);
Run Code Online (Sandbox Code Playgroud)
要么
NSError *error = nil;
[database save:&error];
Run Code Online (Sandbox Code Playgroud)
在ARC下必须以这种方式声明:
- (BOOL)save:(NSError* __autoreleasing *);
Run Code Online (Sandbox Code Playgroud)
但这太模糊了,我想完全理解为什么.我找到的代码片段将__autoreleasing放在两颗星之间,这对我来说很奇怪.类型是NSError**(一个指针指向NSError),那么为什么要放在__autoreleasing星星之间而不是简单地放在前面NSError**呢?
此外,可能还有其他必须依赖的情况__autoreleasing.
我是iOS5开发新手并使用objective-c.我无法理解强存储和弱存储之间的区别.我已经阅读了文档和其他SO问题,但它们听起来与我完全相同,没有进一步的见解.
我阅读了文档:Transitioning To ARC - 它引用了iOS4的retain,assign和release条件; 这让我很困惑.然后我看看Open U CS193p,它区分强弱:
强者:"把它保持在堆中,直到我不再指向它为止"
弱:"只要别人强烈地指出它就保持这种状态"
是不是两个定义相同=如果指针不再指向一个对象,那么释放持有该对象的内存?我理解指针,堆,分配或释放内存的概念 - 但强弱之间有什么区别?
我还没有使用ARC,因为我正在研究的项目中的大部分代码都是在iOS 5.0之前编写的.
我只是想知道,手动保留/释放的便利性(以及可能因此产生的更可靠的代码?)是否超过使用ARC的任何"成本"?您对ARC有什么经历,您会推荐它吗?
所以:
我向你保证,我确实在我的问题中寻找答案,但没有一个是有帮助的.在这里,我得到了一个简单的代码,它应该UIImagePickerController在一个UIPopoverController:
-(void)takePicture:(id)sender{
UIImagePickerController *picker=[[UIImagePickerController alloc] init];
picker.delegate=self;
picker.sourceType=UIImagePickerControllerSourceTypeCamera;
picker.allowsEditing=YES;
UIPopoverController *poc=[[UIPopoverController alloc]
initWithContentViewController:picker];
[poc presentPopoverFromBarButtonItem:bbItem
permittedArrowDirections:UIPopoverArrowDirectionAny
animated:NO];
}
Run Code Online (Sandbox Code Playgroud)
现在,即使从我第一次[UIPopoveController dealloc]到达时...错误和程序崩溃.根据ARC,我没有做任何保留,重新发布或自动释放.UIPopoverControllers当受益于ARC时,有什么特别的考虑吗?
memory-management uipopovercontroller ios automatic-ref-counting