我在osx的目标C中构建了一个应用程序,并且ii不理解为什么有时需要在将其作为参数传递之前将一个对象放入变量中。
通常,这种传递参数的方式效果很好
[object function:[[MyObject alloc]init]];
但是当我在我的应用程序中尝试这样做时
[NSApp setDelegate:[[LHUAppDelegate alloc]init]];
我收到运行时错误的访问错误,所以我必须这样做
LHUAppDelegate* ad = [[LHUAppDelegate alloc]init]; [NSApp setDelegate:ad];
我在其他几次场合都遇到过这个问题,但我从来没有真正理解过为什么,而且我似乎找不到答案。任何帮助深表感谢
我的应用程序委托完全为空,而我的main.c看起来像这样
#include <Cocoa/Cocoa.h>
#include "LHUAppDelegate.h"
#include "LHUView0.h"
int main(int argc, const char * argv[])
{
[NSApplication sharedApplication];
LHUAppDelegate* ad = [[LHUAppDelegate alloc]init];
[NSApp setDelegate:ad];
NSWindow* w = [[NSWindow alloc]initWithContentRect:NSMakeRect(0, 0, 600, 400) styleMask:NSTitledWindowMask backing:NSBackingStoreBuffered defer:YES];
[w setTitle:@"cocoagl"];
[w center];
LHUView0* glv = [[LHUView0 alloc]initWithFrame:NSMakeRect(0, 0, 0, 0) pixelFormat:[NSOpenGLView defaultPixelFormat]];
[w setContentView:glv];
[w makeKeyAndOrderFront:w];
[NSApp run];
return 0;
}
在第一个示例中,设置NSApp的委托将不会保留您的LHUAppDelegate实例。将其存储在当前作用域的变量中将保留它,并调用您期望的正常ARC行为-保留,然后在作用域完成时保留-1来保留(在此示例中,这几乎是应用程序的退出)。
NSApp委托定义为:
@property(assign) id< NSApplicationDelegate > delegate
assign
暗示__unsafe_unretained
。代表通常(总是?)是用这种方式定义的,因为在实例上“设置代表”通常并不/不应该暗示所有权的转移。
在您的第一个示例中,在完成作用域时,LHUAppDelegate实例的保留计数达到零(并由ARC为您重新分配)setDelegate:
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句