我在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;
}

===============>>#1 票数:3 已采纳

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

NSApp委托定义为:

@property(assign) id< NSApplicationDelegate > delegate

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

在您的第一个示例中,在setDelegate:的作用域完成时,LHUAppDelegate实例的保留计数达到零(并由ARC为您重新分配)。

===============>>#2 票数:1

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

  ask by haag translate from so

未解决问题?本站智能推荐:

1回复

您是否需要在GCD的块内创建NSAutoreleasePool?

通常,如果您在NSOperationQueue上生成后台线程或运行NSOperation,则需要为该线程或操作创建NSAutoreleasePool,因为默认情况下不存在。 相同的规则是否适用于放置在Grand Central Dispatch队列中并将在非主线程上运行的块? 也就是说,
2回复

需要在OSX上创建VPN连接L2TP

需要在没有共享密钥的osx上创建VPN连接L2TP 构建后出现此错误后, Missing protocol or protocol has invalid type ,而其他2个协议使用IKE隧道,您能向我建议什么? 其他选项是从代码运行终端并添加此字符串networksetup -connec
4回复

有条件地传递变量参数

在我的iPhone应用程序之一中,我需要有条件地将变量参数发送到操作表。 即 这样做的语法是什么? 应该如何定义otherButtonTitles的数据类型? 提前致谢。 此致Deepa
1回复

查看未显示“有时”可可

在我的AppDelegate-> applicationWillFinishLaunching我加载两个视图控制器 MyCustomViewController的initWithNibName:bundle:方法是自动生成的: 我将其视图添加到自定义视图中: [theMai
4回复

有没有办法将NSArray传递给需要可变数量参数的方法,例如+ stringWithFormat:

一些上下文:我正在尝试清理我的一些FMDB代码。 我的一个表有很多列,我需要使用的FMDB中的方法是需要可变数量的参数,类似于NSString的类方法+stringWithFormat: . 一个例子: 当一个表只有5列时,它并没有那么糟糕,但是当一列有20+时,它开始变得毛茸茸
2回复

需要在可可应用中执行命令

我正在使用Objective-C开发一个macOS应用,我想运行一些与终端相同的命令。 实际上,我想从我的应用程序中运行YOLO命令。 我为此使用NSTask类。 当我通过代码运行命令时,在任务启动时,出现错误“无法打开文件cfg / coco.data”。 相同的命令可以在终端上正常工
3回复

为什么将NSString对象传递给XCTAssertTrue的“format”参数会导致构建错误?

在尝试使用XCTest测试我的应用程序时,执行以下操作时出现构建错误: #import <XCTest/XCTest.h> @interface MyTests : XCTestCase @end @implementation MyTests - (void)testEx
2回复

将变量传递给AppleScript

在Xcode中运行AppleScript的代码如下: 在执行之前,我想知道是否可以设置一些变量供它使用。 换句话说,我想将变量从我的应用程序传递给AppleScript。
1回复

有时无法捕获Fabric macOS异常?

Crashlytics向我展示了一切进展顺利,而实际上有几个人正在经历尚未报告的崩溃-但我确实看到一些崩溃正在进入Crashlytics。 我不明白发生了什么。 我一直在做平常的事情: [Fabric with:@[[Crashlytics class], [Answers clas
1回复

在NIB加载到WindowController中之前,需要反映更改

我想加载我的windowController的nib文件。 我正在从AppDelegate调用windowController类 几乎没有做任何更改来获取Window Controller XIB的值, 在Test1Class中,使用以下方法检索值: 但是,当窗口启动