为什么我有时必须在将对象作为参数传递之前创建变量

时间:2015-05-16 18:00:38

标签: objective-c macos

我在osx的目标c中构建应用程序,我不明白为什么我有时必须在将变量作为参数传递之前将对象放入变量中。

通常这种传递参数的方式很好

[object function:[[MyObject alloc]init]];

但是当我在我的应用中尝试这个时

[NSApp setDelegate:[[LHUAppDelegate alloc]init]];

我收到运行时错误访问错误,所以我必须这样做

LHUAppDelegate* ad = [[LHUAppDelegate alloc]init]; [NSApp setDelegate:ad];

我在其他几个场合都遇到过这个问题而且我从来没有真正理解为什么,而且我似乎无法在那里找到答案。非常感谢任何帮助

我的app委托是完全空的,我的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;
}

2 个答案:

答案 0 :(得分:3)

在第一个示例中,设置NSApp的委托不会保留您的LHUAppDelegate实例。将它存储在当前作用域中的变量中将保留它,调用您期望的正常ARC行为 - 保留,然后在作用域完成时保留-1(在此示例中几乎是app退出)。

NSApp委托定义为:

@property(assign) id< NSApplicationDelegate > delegate

assign暗示__unsafe_unretained。代表通常(总是?)以这种方式定义,因为在实例上“设置委托”通常不会/不应该意味着所有权的转移。

在第一个示例中,setDelegate:的范围完成时,LHUAppDelegate实例的保留计数达到零(并由ARC取消分配)。

答案 1 :(得分:1)

通常,委托属性具有弱连接,或者应该具有弱连接。因此,它在setDelegate之后释放它(HPAppDelegate实例),因为它不再被使用,只能通过setDelegate方法在本地使用。你必须创建一个变量,以便ARC知道它仍然会被使用。