Tag: 自动ref counting

XCode转换为ARC,创build通用二进制失败,错误为“无法找出体系结构types”

我试图将一个iOS(纯粹的Objective-C)项目转换为ARC。 在octest目标CreateUniversalBinary阶段转换失败,出现以下错误。 项目和目标架构的构build设置看起来是正确的,所以我很难理解为什么这是失败的: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/lipo:找不到以下的体系结构types:/ Users / andybowskill / Library / Developer / Xcode / DerivedData / Make- Up_Kit-axtbxqtkmnlfmlcafkoetwqmeufc / Build / Intermediates / Make-Up Kit.build/Debug-iphoneos/Make-Up KitTests.build/Objects-normal/armv7/Make-Up KitTests命令/Applications/Xcode.app/Contents/Developer/Platforms/ iPhoneOS.platform / Developer / usr / bin / lipo失败,退出代码为1 前面提到的CreateUniversalBinary命令如下: CreateUniversalBinary“/ Users / andybowskill / Library / Developer / Xcode / DerivedData / Make-Up_Kit-axtbxqtkmnlfmlcafkoetwqmeufc / Build / Products […]

iOS:阻止属性直接设置访问时崩溃

考虑下面的代码: @interface ClassA : NSObject @property (nonatomic, copy) void(^blockCopy)(); @end @implementation ClassA @synthesize blockCopy; – (void)giveBlock:(void(^)())inBlock { blockCopy = inBlock; } @end 然后在具有strongtypesClassA的类中使用它,称为someA : self.someA = [[ClassA alloc] init]; [self.someA giveBlock:^{ NSLog(@"self = %@", self); }]; dispatch_async(dispatch_get_main_queue(), ^{ self.someA.blockCopy(); self.someA = nil; }); 如果我在启用了ARC的情况下运行了内置的O3 ,则在iOS中它会在self.someA.blockCopy();期间崩溃self.someA.blockCopy(); 在objc_retain里面objc_retain 。 为什么? 现在我意识到人们可能会说我应该用self.blockCopy = inBlock来设置它,但我确实认为ARC应该在这里做正确的事情。 如果我看一下从giveBlock:方法生成的程序集(ARMv7),它看起来像这样: .align 2 .code […]

如何解决“没有已知的select器实例方法performSelector:withObject:afterDelay:'”当迁移到ARC?

ARC迁移工具在开始迁移之前拒绝接受此代码: [self.delegate performSelector:@selector(overlayDismissed:) withObject:self afterDelay:0]; 委托人被强制使用协议来实现这个方法,它应该可以正常工作: @protocol OverlayDelegate <NSObject> – (void)overlayDismissed:(Overlay*)overlay; @end @interface Overlay : UIImageView { id<OverlayDelegate> delegate; } @property (nonatomic, assign) id<OverlayDelegate> delegate; ARC有什么问题? 为什么它告诉我有没有已知的实例方法select器performSelector:withObject:afterDelay:'?

将object_setInstanceVariable()转换为ARC?

我希望转换一个实例 object_setInstanceVariable(self, [key UTF8String], *(id**)addr); 到ARC。 当我尝试使用Xcode内置的Objective-C ARC转换器时,出现以下错误: “object_setInstanceVariable”不可用:在自动引用计数模式下不可用 我应该如何处理这个问题? 我知道我可以把–fno-objc-arc作为编译器标志,但是我非常想用ARC代替,如果可能的话(我有很多目标,否则我将不得不手动更改编译器标志) 。 (代码最初是由Rackspace Mobile Apps的Mike Mayo从NSObject + NSCoding和Archiver获得的)

消息发送到使用Pinterest SDK的解除分配的实例

我正在使用Pinterest iOS SDK在我的iPad应用程序中共享项目。 下面的代码片断总是会随着一条message sent to deallocated instance带有注释的行上的message sent to deallocated instance : NSString *clientId = [NSMutableString stringWithString:@"1431665"]; NSLog(@"clientId: %@", clientId); Pinterest *pinterest = [[Pinterest alloc] initWithClientId:clientId]; NSLog(@"gone: %@", clientId); // <- CRASH! 我正在使用NSMutableString stringWithString来模拟我的应用程序的条件。 我实际上并没有在我的代码中使用这一行。 即使不输出最后一行的clientId ,应用程序在离开块时也会崩溃。 我认为这是因为ARC试图释放已经被释放的引用。 看起来像Pinterest SDK一定是做了一些不可思议的事情,并且摧毁了我传入的string。有什么方法可以解决这个问题吗? 编辑1 简化testing用例。 编辑2 看起来像Pinterest SDK正在使用clientId参数。 基于叮当声ARC文档 ,指出这个__attribute((ns_consumed))的方法是用__attribute((ns_consumed))来表示。 新的问题 :是否有可能表明这个ARC没有修改方法的签名添加属性? 编辑3 所以这是有效的,但它是丑陋的罪? 有另一种方法吗? NSString *clientId […]

在ARC中生成CGImagesAsynchronouslyForTimes

如果我在启用ARC的项目中运行以下项目,则完成处理程序不会触发。 但没有ARC,它按预期工作。 我在这里错过了什么? NSURL *url = [NSURL URLWithString:@"http://media.w3.org/2010/05/sintel/trailer.mp4"]; AVURLAsset *asset=[[AVURLAsset alloc] initWithURL:url options:nil]; AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset]; generator.appliesPreferredTrackTransform = YES; CMTime thumbTime = CMTimeMakeWithSeconds(5,30); AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error){ NSLog(@"completion handler"); }; generator.maximumSize = CGSizeMake(320, 180); [generator generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:thumbTime]] completionHandler:handler];

iOS:__weak vs(弱)

这两行代码有差别吗? __weak IBOutlet UITextField *usernameField; @property (weak) IBOutlet UITextField *usernameField; 如果你在.h或者.m文件的接口部分声明了这些信息呢?

何时以及为什么要使用ARC将局部variables声明为__weak?

迈克·阿什把这个介绍写到了ARC ,他介绍了这样一些内容: __weak Foo *_weakFoo = [object foo]; 为什么我要为一个本地临时variables做这个? __weak是一个归零引用,一旦引用的对象被释放,_weakFoo指针就会自动设置为nil。 另外,__weak仅在iOS> = 5中可用。 我什么时候会遇到麻烦? Foo *_weakFoo = [object foo]; 这总是期望返回一个对象或零。 我的猜测是这样的: Foo *_weakFoo = [object foo]; [self doSomethingStupid]; // does something bad so foo gets deallocated [_weakFoo doIt]; // CRASH! msg sent to deallocated instance 0x123456 还有一件事让我感到困惑,那就是:什么时候知道我不再需要一个对象? 我会争辩说,当我设置一个指针为零或其他的东西时,会发现先前引用的对象不再需要这个所有者,因此可能会消失。 但重点是:我把它设置为零。 所以它无论如何是零! 那么,什么时候__弱化一个局部variables是有道理的,那么我必须在别的地方做什么样的疯狂的事情,以至于我真的需要这个?

修复ARC中潜在的内存泄漏

以下单例类(SharedManager)辅助方法可能会导致保留周期。 在静态分析器中获取警告:“在线分配的对象的潜在泄漏”我该如何解决? 我确实尝试了让伊娃使用__weak,但是当我分析时仍然会出现警告。 NSString *__weak uuid = (__bridge NSString *)CFUUIDCreateString(kCFAllocatorDefault, uuidObject); 谢谢 像这样在课堂上被召唤: myUUID = [SharedManager generateUUID]; + (NSString *)generateUUID { CFUUIDRef uuidObject = CFUUIDCreate(kCFAllocatorDefault); NSString *uuid = (__bridge NSString *)CFUUIDCreateString(kCFAllocatorDefault, uuidObject); CFRelease(uuidObject); return uuid; }

Objective C UIImagePNGRepresentation内存问题(使用ARC)

我有一个基于ARC的应用程序,从Web服务加载大约2000个相当大(1-4MB)的Base64编码图像。 它将Base64解码的string转换为.png图像文件并将其保存到磁盘。 这一切都在一个循环,我不应该有任何挥之不去的引用。 我分析了我的应用程序,发现UIImagePNGRepresentation占用了大约50%的可用内存。 我看到它的方式,UIImagePNGRepresentationcaching它创build的图像。 解决这个问题的一个方法是刷新caching。 任何想法如何可以做到这一点? 另一种解决scheme是使用UIImagePNGRepresentation以外的东西? 我已经试过这个没有运气: 使用UIImagePNGRepresentation内存问题 。 更何况,我不能真正使用那里提供的解决scheme,因为它会使我的应用程序太慢。 这是我从我的循环调用的方法。 UIImage是从Base64转换的图像: + (void)saveImage:(UIImage*)image:(NSString*)imageName:(NSString*)directory { NSData *imageData = UIImagePNGRepresentation(image); //convert image into .png format. NSFileManager *fileManager = [NSFileManager defaultManager]; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); //create an array and store result of our search for the documents directory in it NSString *documentsDirectory = […]