我正在尝试将一个登录窗口显示为来自我的MainWindow的工作表,但每当我尝试实现AppKit方法时,总会出现错误,因为各种无法区分的原因.
没有任何在线指南有效,当我将他们的代码/改编的课程应用到我自己的项目时,他们永远不会工作.
大多数指南都过时了,包括Apple文档.而且它们似乎都与自动参考计数兼容.或Xcode 4接口.
有人能够在完整的指南中为我详细说明,以便在MainWindow上按下按钮后显示表单的最简单方法.
如果需要,请随时询问更多信息.
我将我的应用程序转换为ARC,并注意到在我的一个视图控制器中分配的对象在该视图控制器被解除分配时没有被解除分配.花了一段时间才弄清楚原因.我在调试时为我的项目启用了Zombie Objects,结果证明这是原因.考虑以下应用程序逻辑:
1)用户调用动作RootViewController,导致a SecondaryViewController通过创建和呈现presentModalViewController:animated.
2)SecondaryViewController包含ActionsController一个NSObject子类.
3)ActionsController通过NSNotificationCenter初始化时观察通知,并在取消分配时停止观察.
4)用户解雇SecondaryViewController返回RootViewController.
关闭"启用僵尸对象",上面的工作正常,所有对象都被取消分配.启用Zombie Objects on ActionsController即使SecondaryViewController已取消分配,也不会取消分配.
这导致我的应用程序中的问题b/c NSNotificationCenter继续向其发送通知,ActionsController并且生成的处理程序导致应用程序崩溃.
我创建了一个简单的应用程序,在https://github.com/xjones/XJARCTestApp上说明了这一点.查看控制台日志,启用/启用"启用僵尸对象"以验证这一点.
问题(S)
编辑#1:根据凯文的建议,我已经将其提交给Apple和openradar,网址为http://openradar.appspot.com/10537635.
编辑#2:澄清一个好的答案
首先,我是一位经验丰富的iOS开发人员,我完全理解ARC,僵尸对象等.如果我遗漏了某些东西,当然,我很欣赏任何照明.
其次,这种特定崩溃的解决方法是actionsController在secondaryViewController解除分配时作为观察者删除.我还发现如果我明确设置actionsController = nil什么时候secondaryViewControllerdealloc'ed它将被dealloc'ed.这两个都不是很好的解决方法b/c它们实际上要求你使用ARC但是代码好像你没有使用ARC(例如在dealloc中明确地使用nil iVars).特定的解决方案也无法确定何时这会成为其他控制器中的问题,因此开发人员确定地知道何时/如何解决此问题.
一个好的答案将解释如何确定性地知道你需要在使用ARC + NSZombieEnabled时对某个对象做一些特殊的事情,这样它就可以解决这个具体的例子并且通常也适用于整个项目而不会留下其他类似的潜力问题.
完全有可能没有好的答案,因为这可能是XCode中的一个错误.
谢谢大家!
我有一个视图(我们称之为视图A),weak它的超级视图具有属性(视图B).查看KVO的超视图,视图B.由于视图A对视图B的引用是弱属性(为了防止保留周期),如何移除观察者(A观察B)?在我有机会删除之前,查看A对视图B的引用已经过了.
由于视图控制器具有对A的强引用,因此B比B更长.这是泄漏的日志消息:
An instance 0x9ac5200 of class UITableView was deallocated while key value observers were still registered with it. Observation info was leaked, and may even become mistakenly attached to some other object. Set a breakpoint on NSKVODeallocateBreak to stop here in the debugger. Here's the current observation info:
<NSKeyValueObservationInfo 0x8660360> (
<NSKeyValueObservance 0x8660320: Observer: 0x8660020, Key path: contentOffset, Options: <New: YES, Old: NO, Prior: NO> Context: 0x8660020, Property: 0x864ac80>
)
Run Code Online (Sandbox Code Playgroud)
B是UITableView.设置断点会NSKVODeallocateBreak产生无用的结果.
在A的removeFromSuperview,我尝试删除观察者但是A对B参考已经nil …
我正在将一段代码迁移到自动引用计数(ARC),并让ARC迁移器抛出错误
NSInvocation的的setArgument是不是安全,可以使用一个对象,具有比__unsafe_unretained其他所有制
在我使用类似的东西分配对象的代码上
NSDecimalNumber *testNumber1 = [[NSDecimalNumber alloc] initWithString:@"1.0"];
Run Code Online (Sandbox Code Playgroud)
然后使用将其设置为NSInvocation参数
[theInvocation setArgument:&testNumber1 atIndex:2];
Run Code Online (Sandbox Code Playgroud)
为什么它阻止你这样做?使用__unsafe_unretained对象作为参数似乎同样糟糕.例如,以下代码导致ARC下崩溃:
NSDecimalNumber *testNumber1 = [[NSDecimalNumber alloc] initWithString:@"1.0"];
NSMutableArray *testArray = [[NSMutableArray alloc] init];
__unsafe_unretained NSDecimalNumber *tempNumber = testNumber1;
NSLog(@"Array count before invocation: %ld", [testArray count]);
// [testArray addObject:testNumber1];
SEL theSelector = @selector(addObject:);
NSMethodSignature *sig = [testArray methodSignatureForSelector:theSelector];
NSInvocation *theInvocation = [NSInvocation invocationWithMethodSignature:sig];
[theInvocation setTarget:testArray];
[theInvocation setSelector:theSelector];
[theInvocation setArgument:&tempNumber atIndex:2];
// [theInvocation retainArguments];
// Let's say we don't use this invocation until after the original pointer …Run Code Online (Sandbox Code Playgroud) 我曾经在调试器下使用[myVar retainCount]验证我的一些变量是否具有预期的保留计数,尤其是对于没有自定义dealloc的var.
你如何在ARC模式下这样做?你如何确保没有内存泄漏?
注意:我理解ARC应该为我处理这个问题,但生活远非完美,而在现实生活中,你有一些有时被第三方库分配的对象(使用retain?)并且永远不会被解除分配.
我这样做的图像:
MyObj *myObj=[[MyObj alloc] init];
Run Code Online (Sandbox Code Playgroud)
然后我打电话
[somethingElse doSomethingWithMyObj:myObj];
Run Code Online (Sandbox Code Playgroud)
后来,我做到了
myObj=NULL;
Run Code Online (Sandbox Code Playgroud)
如果我的程序工作正常,我的期望是myObj正在被销毁,但似乎并非如此......
那么我该如何跟踪这一点,特别是如果我没有管理的东西?
现在,关于工具:在我的mac(使用5 Meg)上运行内存工具似乎非常困难,无需重新启动mac并从头开始.这真烦人!即使在程序启动之前,仪器仍然会崩溃,那么是否有更改解决方案?
以下是我以前编写自定义保留 setter的方法:
- (void)setMyObject:(MyObject *)anObject
{
[_myObject release], _myObject = nil;
_myObject = [anObject retain];
// Other stuff
}
Run Code Online (Sandbox Code Playgroud)
当属性设置为strong时,如何使用ARC实现此目的.如何确保变量具有强指针?
我试图找出一种方法来typeof创建一个弱的引用,self以便在块中使用,以避免保留周期.
当我第一次读到这个时,似乎是使用惯例__block typeof(self) bself = self;,编译但是使用__block以避免保留周期不再起作用而__weak应该使用.
但是会__weak typeof(self) bself = self;导致错误:
类型'typeof(self)'(又名'TUAccountsViewController*const __strong')已经设置了保留属性
有没有办法使用typeof或其他调用一般创建一个弱引用self?
cocoa weak-references objective-c objective-c-blocks automatic-ref-counting
我试图从图像数组中在iPhone中制作一个简单的动画图像:
- (void)viewDidLoad {
NSArray *imageArray;
imageArray = [[NSArray alloc] initWithObjects:
[UIImage imageNamed:@"sun1"],
[UIImage imageNamed:@"sun2"],
nil];
fadeImage.animationImages = imageArray;
fadeImage.animationDuration = 1;
[imageArray release]; //==== HERE IS WHERE I GET THE ERROR ======
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?
我最近下载了Xcode 5,它现在是我的主要IDE.但是,我现在需要为项目中的单个文件禁用自动引用计数.
在Xcode 4中,我进入了目标下的Build Phases选项卡,我可以双击Compile Sources部分中行的右侧,添加-fno-objc-arc到编译器标志列表中,然后关闭.
然而,在5中,该列似乎是不可点击的:

那么,我该怎么做?
我有点困惑.我读过的每个地方都建议,在使用ARC时,你仍然需要释放有意义的核心基础对象,ARC不管理它们.但是,我有一个方法,它使用我使用的一些CF方法/对象CFRelease,但然后导致应用程序崩溃.取消注释我CFRelease的问题解决了这个问题,但后来我假设我有内存泄漏?
有人可以解释哪些东西需要发布,哪些不需要,或者其他任何错误的代码?
+ (NSString *) fileExtensionForMimeType:(NSString *)type
{
CFStringRef mimeType = (__bridge CFStringRef)type;
CFStringRef uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, mimeType, NULL);
CFStringRef extension = UTTypeCopyPreferredTagWithClass(uti, kUTTagClassFilenameExtension);
NSString *ext = (__bridge NSString *)extension;
// CFRelease(mimeType);
// CFRelease(uti);
// CFRelease(extension);
return ext;
}
Run Code Online (Sandbox Code Playgroud)
三个注释掉的CFRelease电话修复了上述问题,但我知道这是错误的.我该怎么办?
objective-c ×7
ios ×5
cocoa ×3
iphone ×3
animation ×1
cocoa-sheet ×1
cocoa-touch ×1
macos ×1
osx-lion ×1
properties ×1
xcode ×1
xcode4.2 ×1