我正在使用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 - 自动参考计数
我刚刚开始运行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
我开始使用iOS5,我已经为我的项目启用了ARC.我有一个类在deallocation我保存该对象的状态.
-(void)dealloc {
[self save];
[super dealloc];
}
Run Code Online (Sandbox Code Playgroud)
但是,在ARC下,[super dealloc]是不允许的?如果在这种情况下你没有在超类上调用dealloc方法,我认为它被认为是一个错误?
那么现在解除对象的适当方法是什么?
在我更新到Xcode 4.2后,我无法再发布任何内容.当我开始键入"release"时,它会建议"释放",但是会有一条红线.
如果我写它仍然显示错误并显示以下两条消息:
'release'不可用:在自动引用计数模式下不可用自动引用计数禁止显式消息发送'release'
有谁知道我能做什么?
我在纯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
在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) 苹果斯威夫特编程语言指南中提到的捕捉符 unowned(safe)和unowned(unsafe),除了weak和unowned.
我(想我)明白之间的差别weak和unowned; 但unowned(safe)和之间有什么区别unowned(unsafe)?指南没有说.
请:不要仅仅依赖于描述Objective-C等价物.
我已阅读并发编程指南
在指南中,文本指出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)
nsoperation nsautoreleasepool ios automatic-ref-counting ios8
我有一个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在上面丑陋的闭包装上构建一个方便函数作为语法糖.
这个问题已经清理完毕,重要的信息转移到下面的答案.
我对内存管理有一些疑问.
我正在构建一个照片编辑应用程序.因此,保持低内存使用率非常重要.此外,我不会发布代码,因为在执行某项特定操作时我没有大量内存泄漏.我只是丢失了几个KB/MB的所有发生的事情.通过成千上万行代码来查找千字节并不好玩;)
我的应用程序使用核心数据,许多cifilter东西,位置和基础知识.
我的第一个视图只是一个tableview,花了我大约5mb的内存.然后你拍摄一些照片,应用一些过滤器,这会保存到核心数据然后你回到第一个视图.
除了驱动第一个视图所需的数据之外,是否有可能真正摆脱内存中的所有内容.(非常节省和令人敬畏的5mb)
或者即使你把所有东西都设为零,总会留下一些东西?
奖金问题:UIImageJPEGRepresentation和
之间的文件大小/ CPU负载是否存在差异UIImagePNGRepresentation?我知道你可以用JPEG方法设置压缩质量(在cpu/gpu上更难?).
只是尽可能地减少记忆压力.
更新:
有人向我指出,这个问题可能过于含糊.
我在某些时候遇到的问题如下:
这些都是在iPhone 4s上测试的,而不是模拟器.
这里有一个模因来减轻这个网站的情绪.
ios ×5
objective-c ×5
swift ×3
ios5 ×2
iphone ×2
cocoa-touch ×1
delegates ×1
ios8 ×1
nsoperation ×1