Tag: 自动ref counting

在ARC下的Objective-C对象的C风格数组指针

我有一个指向Objective-C实例的二维数组来跟踪地图网格上的游戏对象。 现在我正在将我的代码转换到ARC,Xcode指出了错误。 我知道指向对象的指针不允许作为struct成员,但是这个引起了我(几乎)的不安。 我了解ARC约束的基本原理,但是: 在网格中查找对象时,我无法承受Objective-C数组的开销 这些对象本身已经被一个在同一个类中定义的具有C风格的网格的NSArray伊娃所拥有, C风格的数组只是一个方便结构化的捷径。 此外,当从拥有的NSArray中移除对象时,我将相应的网格槽设置为NULL 。 也就是说,二维数组(网格)只是一个快速(但愚蠢)指针对象安全地保留在其他地方( NSArray伊娃)的集合。 有没有办法摆脱这个使用强制转换? 例如,定义和分配我的网格为: void*** _grid; 代替 MyMapObjectClass*** _grid 并在设置或获取每个插槽中的指针时,在void* < – > MyMapObjectClass*之间使用(适当地桥接) 编辑 :所以这里是我如何解决它 我如上所述改变了伊娃的声明。 另外,当设置我的查询网格的条目时,我这样做了: // (Done **Only Once** at map initialization) // _objectArray is an instance of NSMutableArray MyMapObjectClass* mapObject = [[MyMapObjectClass alloc] init]; // …configure map object, etc… // Add to […]

如何在项目之间添加ARC

我正在创buildiPhone应用程序,我需要使用SDWebImage 。 为此,我需要使用ARC。 任何想法如何在项目之间添加ARC? 注意:在一个文件中我有下面的内容。 #if !__has_feature(objc_arc) #error SDWebImage is ARC only. Either turn on ARC for the project or use -fobjc-arc flag #endif 我应该在哪里添加-fobjc-arc标志?

未调用UIViewController-dealloc方法

我正在使用自动引用计数。 我有一个自定义的UIViewController子类,每当我调用-presentViewController: animated:completion:或从-presentViewController: animated:completion:视图中删除它的视图我想NSLog东西像“我dealloced”,所以我知道视图控制器已被成功删除。 我在我的视图控制器中实现了-dealloc方法。 然而,我开始了一个testing项目,我刚刚有两个UIViewController实例(没有保留周期)和-dealloc不调用或者当我推动第二个UIViewController模态或当我删除超级视图或当我从父视图控制器中删除它。 我错过了什么吗? 在我原来的项目(不是testing案例)中,乐器向我展示了那些控制器留下的内存空间,我无法摆脱。

使对象保持活动状态,直到后台任务完成

我试图实现一个方法,在后台执行一个任务,然后调用主线程上的一个块: + (void)migrateStoreWithCompletionHandler:(MigrationControllerCompletion)completion { MigrationController *controller = [[MigrationController alloc] initWithCompletionBlock:completion]; [controller migrateStore]; } 这是-initWithCompletionBlock:方法: – (id)initWithCompletionBlock:(MigrationControllerCompletion)completion { self = [super init]; if (self) { _completion = [completion copy]; } return self; } 后台工作发生在-migrateStore 。 问题是ARC在[controller migrateStore]之后释放controller 。 因为controller是保持在块上的对象,我不能永远称它。 有没有人有任何build议如何解决这个问题?

应用程序崩溃说使用弧的内存警告

我正在使用ARC和应用程序崩溃说收到内存警告 。 我用过苹果乐器: 看起来我没有任何泄漏,但我找不到错在哪里。 崩溃与内存和适当的弧我不能使用释放和任何sorting。 这是我第一次使用弧来处理内存使用情况。 有没有我可以debugging,因为我处理了近两个月。 我有我的代码在我的git集线器,所以这将是有帮助的,如果你看看它。 你可以在这里find它。 我正在处理这个问题几个星期,并希望结束这一点。 谢谢。

使用ARC(强/弱)避免循环保留,学习一些基本知识

我似乎还没有遇到问题,但我正在努力确保我正在使用一些最佳做法。 说我有一个UITableViewController与一个NSArray的MyObject对象的数据源。 所以在我的UITableViewController我声明我的数据源如: @property (strong, nonatomic) NSArray *dataSource; 然后,当我触摸一个单元格时,我想推入一个显示某个细节视图的新视图,使用该单元格的MyObject。 所以在新的UIViewController我有这个: @property (strong, nonatomic) MyObject *myObject; 现在在触摸一个单元格的UITableViewController中: MyObject *myObject = [[self dataSource] objectForIndex:[indexPath row]]; NewView *view = [[NewView alloc] initWithMyObject:myObject]; // … push onto nav controller, etc 基本上我害怕的是我的数组被声明为强壮的 ,详细视图中的MyObject声明为强 ,谁知道也许有另一个视图与强壮声明相同的MyObject声明。 底线:这是在视图之间传递对象的正确方法吗? 我的应用程序还没有真正使用过弱引用,我觉得这是不对的。 任何帮助或链接来帮助将是惊人的。

NSMutableArray内的块泄漏(ARC)

我有一些块内的操作。 这个操作只是像这样更新一个UIImage : ^(UIImage *image) { self.myImage = image; }]; 我的图像是通过NSURLConnection访问互联网来计算的。 当我从互联网上收到图像时,我会调用NSMutableArray那个块。 到现在为止还挺好。 我的问题是,当我有多个图像具有相同的URL,而不是进行多个调用,我只是添加一个新的块到处理连接的类内的NSMutableArray 。 这样,我只需要打一个电话,就可以更新多个共享URL的图像。 一切正常,问题是,我正在泄漏块。 我将这样的块添加到NSMutableArray : if( (self = [super init]) ) { self.connectionURL=url; self.arrayOfBlocks=[NSMutableArray array]; [arrayOfBlocks addObject:completion]; } return self; 这是连接类被初始化的时候。 这是当我需要添加一个新的块到NSMutableArray (我只添加它,就是这样): [arrayOfBlocks addObject:completion]; 这是当我最终收到回电,并开始执行块: for (MyBlock blockToExecute in arrayOfBlocks) { blockToExecute([UIImage imageWithData:data]); } 问题是这个漏水了。 因为我在ARC环境中,所以无法抵消使用版本或自动发布的情况。 那么有什么解决办法?

使用捕获列表中的无主,导致崩溃,甚至块本身不执行

在这里,我在玩漏洞,所以我有意识地做了一个强大的参考周期,看看仪器是否会检测到某些东西,并且我得到了意想不到的结果。 在乐器中显示的泄漏当然是有道理的,但随机的崩溃有点神秘(由于我将在后面提到的两个事实)。 我在这里有一个叫做SomeClass的类: class SomeClass{ //As you can guess, I will use this shady property to make a strong cycle 🙂 var closure:(()->())? init(){} func method(){} deinit {print("SomeClass deinited")} } 另外我有两个场景, GameScene : class GameScene: SKScene { override func didMoveToView(view: SKView) { backgroundColor = .blackColor() let someInstance = SomeClass() let closure = {[unowned self] in […]

ARC:“指向非常量types”id“没有明确的所有权”

我正在升级一个iOS 4项目,使用ARC与sdk5。 所以我想使用自动重构方法转换代码使用ARC。 不幸的是,它没有工作。 我收到很多错误.. for(id* child in childObjectArray){ [child removeParentGroupReferences]; } 这给了我以下的错误输出: 指向非常量types“id”,没有明确的所有权 有什么帮助吗? 我必须改变什么? 谢谢你的帮助..

在ARC存在的情况下,初始化iVarvariables的正确方法是什么?

例如iVar foo , @property (nonatomic) NSString* foo; // inside .h 选项1 @Synthesize foo; //Inside .m foo = [[NSString alloc] init]; // viewDidLoad method 选项2 @Synthesize foo; //Inside .m self.foo = [[NSString alloc] init]; // viewDidLoad method 选项3 @Synthesize foo = _foo; //Inside .m _foo = [[NSString alloc] init]; // viewDidLoad method 为什么? 在许多地方,我看到的代码有不同的方式来做对象在Obj – C,但哪一个是最好的做法?