标签: automatic-ref-counting

声明委托ivar时出现ARC错误

我正在使用ARC(不,这不是NDA).我在我的界面中宣布我的ivar

id itemDelegate;
Run Code Online (Sandbox Code Playgroud)

然后我宣布财产:

@property (nonatomic, weak) id<mySecretDelegateYouAreNotSupposedToSeeOnSO> itemDelegate; (由于ARC而弱而不是分配)

在我的实现文件中,我只是合成它: @synthesize itemDelegate;

但是,我收到错误:

"Existing ivar 'ItemDelegate' for _weak property 'itemDelegate' must be _weak".
Run Code Online (Sandbox Code Playgroud)

谁知道什么是错的?谢谢你的帮助.

ARC - 自动参考计数

iphone ios automatic-ref-counting

27
推荐指数
2
解决办法
2万
查看次数

Cocoa-Touch - 代表混淆

我刚刚开始运行Xcode 4.2.1和iOS5 SDK的新项目.该项目是使用ARC设置的.我正在尝试将AppDelegate设置为UITabBarController的委托,[tabBarController setDelegate:self];如果我这样做,我会收到一条警告消息:

warning: Semantic Issue: Sending 'AppDelegate *const __strong' to parameter of incompatible type 'id<UITabBarControllerDelegate>'
Run Code Online (Sandbox Code Playgroud)

好吧,我设置我的AppDelegate以符合UITabBarControllerDelegate

@interface AppDelegate : UIResponder <UIApplicationDelegate, UITabBarControllerDelegate>
Run Code Online (Sandbox Code Playgroud)

好的,警告消失了.

我现在得到另一个错误.在一个视图控制器中,我希望得到一个AppDelegate,所以我这样做:AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];但这会发出警告说:

warning: Semantic Issue: Initializing 'AppDelegate *__strong' with an expression of incompatible type 'id<UIApplicationDelegate>'
Run Code Online (Sandbox Code Playgroud)

但如果我删除我的AppDelegate符合UITabControllerDelegate协议我的第二个警告消失.

非常奇怪的行为,是什么让Cocoa专家?

cocoa-touch delegates objective-c uiapplicationdelegate automatic-ref-counting

27
推荐指数
1
解决办法
9862
查看次数

自动引用计数(ARC)表示禁止调用[super dealloc] ...有什么替代方案?

我开始使用iOS5,我已经为我的项目启用了ARC.我有一个类在deallocation我保存该对象的状态.

-(void)dealloc {
    [self save];
    [super dealloc];
}
Run Code Online (Sandbox Code Playgroud)

但是,在ARC下,[super dealloc]是不允许的?如果在这种情况下你没有在超类上调用dealloc方法,我认为它被认为是一个错误?

那么现在解除对象的适当方法是什么?

objective-c ios5 automatic-ref-counting

26
推荐指数
1
解决办法
9356
查看次数

为什么我不能再释放一个物体了?

在我更新到Xcode 4.2后,我无法再发布任何内容.当我开始键入"release"时,它会建议"释放",但是会有一条红线.

如果我写它仍然显示错误并显示以下两条消息:

'release'不可用:在自动引用计数模式下不可用自动引用计数禁止显式消息发送'release'

有谁知道我能做什么?

objective-c automatic-ref-counting

26
推荐指数
1
解决办法
4万
查看次数

ARC,通过捕获的自我在块和参考周期中的ivars

我在纯iOS5/ARC环境中工作,所以我可以根据需要使用__weak引用.我在很多情况下都会在块中引用ivars,最值得注意的是,移动视图的动画块,也就是我的视图控制器类的属性.

我的问题:

在块中最平凡地使用ivars,我是否创建了一个参考周期?每次我编写一个操作包含对象的实例变量的块时,是否需要使用__weak self/strong self技术?

我一直在重新观看2011年WWDC会议#322(Objective-C Advancements in Depth),以了解从时间索引25:03开始的关于"参考周期通过捕获的自我"的3分钟段的细微差别.对我来说,这意味着任何块中ivars的使用都应该通过该段中描述的弱自我/强自我设置来保护.

下面的视图控制器上的示例方法是我做的动画的典型.

在openIris块中,引用ivars"_topView"和"_bottomView"是不对的?

我应该总是在块之前设置一个__weak引用自身,然后在块内强引用刚刚设置的弱引用,然后通过我块中的强引用访问ivars吗?

从WWDC会话中,我理解在块中引用ivars实际上是在创建对这些ivars挂起的隐含自我的引用.

对我而言,这意味着没有任何简单或微不足道的情况,在没有弱/强舞的情况下访问块中的ivars是正确的,以确保没有循环.或者我是否正在阅读一个不适用于简单案例的角落案例,例如我的例子?

- (void)openIrisAnimated:(BOOL)animated
{
    if (_isIrisOpened) {
        NSLog(@"Asked to open an already open iris.");
        return; // Bail
    }

    // Put the common work into a block.
    // Note: “_topView” and “_bottomView” are the backing ivars of 
    // properties “topView” and “bottomView”
    void (^openIris)() = ^{
        _topView.frame     = CGRectMake(....);        
        _bottomView.frame  = CGRectMake(....);
    };

    // Now do the actual opening of the iris, whether animated or not: …
Run Code Online (Sandbox Code Playgroud)

objective-c ios objective-c-blocks ios5 automatic-ref-counting

26
推荐指数
1
解决办法
6687
查看次数

objective-c ARC只读属性和私有setter实现

在ARC之前,如果我想要一个属性只读它而在课堂上可写,我可以这样做:

// Public declaration
@interface SomeClass : NSObject
    @property (nonatomic, retain, readonly) NSString *myProperty;
@end

// private interface declaration
@interface SomeClass()
- (void)setMyProperty:(NSString *)newValue;
@end

@implementation SomeClass

- (void)setMyProperty:(NSString *)newValue
{ 
   if (myProperty != newValue) {
      [myProperty release];
      myProperty = [newValue retain];
   }
}
- (void)doSomethingPrivate
{
    [self setMyProperty:@"some value that only this class can set"];
}
@end
Run Code Online (Sandbox Code Playgroud)

使用ARC,如果我想覆盖setMyProperty,则不能再使用retain/release关键字,这是否足够正确?

// interface declaration:
@property (nonatomic, strong, readonly) NSString *myProperty;

// Setter override
- (void)setMyProperty:(NSString *)newValue
{ 
   if (myProperty != newValue) { …
Run Code Online (Sandbox Code Playgroud)

iphone objective-c ios automatic-ref-counting

26
推荐指数
2
解决办法
1万
查看次数

Swift在"无主(安全)"和"无主(不安全)"之间有什么区别?

苹果斯威夫特编程语言指南中提到的捕捉符 unowned(safe)unowned(unsafe),除了weakunowned.

我(想我)明白之间的差别weakunowned; 但unowned(safe)和之间有什么区别unowned(unsafe)?指南没有说.


请:不要仅仅依赖于描述Objective-C等价物.

memory-management automatic-ref-counting swift

26
推荐指数
4
解决办法
5156
查看次数

现代iOS 8 NSOperation使用仍然需要@autoreleasepool吗?

我已阅读并发编程指南

在指南中,文本指出GCD调度队列定义了他们自己的@autoreleasepool池,并提到仍然建议在每个调度级别定义一个,但是对于NSOperation没有说什么,Apple提供的示例代码也没有显示@autoreleasepool结构.在NSOperation的背景下,模糊地提到@autoreleasepool的唯一地方是修订历史,

2012-07-17 - 删除了有关自动释放池使用操作的过时信息.

查看在线提供的示例代码,例如 http://www.raywenderlich.com/19788/how-to-use-nsoperations-and-nsoperationqueues在基于NSOperations的对象的实现中使用@autoreleasepool,例如:

@implementation ImageDownloader

- (void)main {
    @autoreleasepool {
      ...
    }
}     
@end
Run Code Online (Sandbox Code Playgroud)
  1. 我应该如何实现现代NSOperation对象?
  2. Apple在2012-07-17之间提到的更新是什么?

nsoperation nsautoreleasepool ios automatic-ref-counting ios8

25
推荐指数
1
解决办法
2391
查看次数

在Swift中使方法自我弱化

我有一个Swift类需要存储自己的方法表.不幸的是,这导致了一个引用循环,因为它的表保留self了对它存储的方法的引用.

示例泄漏代码如下:

typealias Callback = ()->()

class CycleInducingClass : NSObject {
    var myCallbacks = [Callback]()  

    override init() {
        super.init()
        myCallbacks.append(myInternalFunction)
    }

    func myInternalFunction() {
        NSLog("lolol: %d", self.myCallbacks.count)
    }
}
Run Code Online (Sandbox Code Playgroud)

到目前为止我找到的唯一解决方案是改为:

myCallbacks.append({[unowned self] in self.myInternalFunction()})
Run Code Online (Sandbox Code Playgroud)

这很丑陋,容易出错.有更好的想法吗?是否有一些技巧使函数引用本身变弱?即制作myCallbacks类型myCallbacks : [WeakCallback]()或类似的数组?据我所知,我甚至无法weaken在上面丑陋的闭包装上构建一个方便函数作为语法糖.

automatic-ref-counting swift

25
推荐指数
1
解决办法
3418
查看次数

迅捷管理记忆

这个问题已经清理完毕,重要的信息转移到下面的答案.


我对内存管理有一些疑问.

我正在构建一个照片编辑应用程序.因此,保持低内存使用率非常重要.此外,我不会发布代码,因为在执行某项特定操作时我没有大量内存泄漏.我只是丢失了几个KB/MB的所有发生的事情.通过成千上万行代码来查找千字节并不好玩;)

我的应用程序使用核心数据,许多cifilter东西,位置和基础知识.

我的第一个视图只是一个tableview,花了我大约5mb的内存.然后你拍摄一些照片,应用一些过滤器,这会保存到核心数据然后你回到第一个视图.

除了驱动第一个视图所需的数据之外,是否有可能真正摆脱内存中的所有内容.(非常节省和令人敬畏的5mb)

或者即使你把所有东西都设为零,总会留下一些东西?


奖金问题:UIImageJPEGRepresentation和 之间的文件大小/ CPU负载是否存在差异UIImagePNGRepresentation?我知道你可以用JPEG方法设置压缩质量(在cpu/gpu上更难?).

只是尽可能地减少记忆压力.


更新:

有人向我指出,这个问题可能过于含糊.

我在某些时候遇到的问题如下:

  • 在某些时候,峰值内存使用率太高
  • 导航到第二个视图控制器并返回导致泄漏
  • 编辑图像会导致内存泄漏.
  • 将过滤器应用于4-5个以上的图像会因内存不足而导致崩溃,此时不再有内存泄漏.(在文书中核实)

这些都是在iPhone 4s上测试的,而不是模拟器.

这里有一个模因来减轻这个网站的情绪.

memory-management ios automatic-ref-counting swift

25
推荐指数
2
解决办法
3万
查看次数