作为正在阅读Apple的Objective-C 2.0文档的Java开发人员:我想知道" 向nil发送消息 "意味着什么 - 更不用说它实际上有用了什么.摘自文档:
Cocoa中有几种模式可以利用这一事实.从消息返回到nil的值也可能是有效的:
- 如果该方法返回一个对象,任何指针类型,任何大小小于或等于sizeof(void*),float,double,long double或long long的整数标量,则发送给nil的消息返回0 .
- 如果该方法返回一个结构,如Mac OS X ABI函数调用指南所定义的那样在寄存器中返回,那么发送给nil的消息将为数据结构中的每个字段返回0.0.其他结构数据类型不会用零填充.
- 如果该方法返回除上述值类型之外的任何内容,则发送到nil的消息的返回值是未定义的.
Java是否让我的大脑无法解释上面的解释?或者是否有一些我想念的东西会让它像玻璃一样清晰?
我确实在Objective-C中得到了消息/接收器的概念,我只是对接收器碰巧感到困惑nil.
错误:无法捕获视图层次结构.详细信息:日志标题:数据源表达式执行失败.日志详细信息:误差评估表达式"(ID)[[(类)objc_getClass( "DBGTargetHub")sharedHub] performRequestWithRequestInBase64:@ "/ XxATTlNNdXRhYmxlRGljdGlvbmFyeaM + QDxcTlNEaWN0aW9uYXJ5XxAPSW5pdGlhbCByZXF1ZXN0XxAkQ0U4OUY0RkItRkRGRS00RUNGLUIwNzctMUQyNDk1REMzMjRCEAHSODlARaJAPF8QD05TS2V5ZWRBcmNoaXZlctFISVRyb290gAEACAARABoAIwAtADIANwBRAFcAXgBmAHEAeAB/AIEAgwCFAIcAiQCLAJIAlACWAJgAmgCcAJ4AoAC + AN0A9wEYATgBUgFUAVsBYAFiAWQBZgFoAW0BbwFxAXMBdQF3AY0BoQG3AdAB0gHTAdgB2QHbAeAB6wH0AfwB/wIIAg0CIwInAjQCRgJtAm8CdAJ3AokCjAKRAAAAAAAAAgEAAAAAAAAASgAAAAAAAAAAAAAAAAAAApM ="]":错误:执行被中断,原因: EXC_BAD_ACCESS(代码= 1,地址= 0x0).
该过程已返回到表达式评估之前的状态.
我刚被一个令人讨厌的bug所困扰,这个bug被Objective-C中的"发送消息给nil确定"行为所掩盖.
我见过发送消息给零?而且共识似乎是'我们如何在Objective-C中滚动'.
现在,也许我没有足够的Objective-C经验,但似乎陷入困境似乎是有用的,因为我无法想到为什么大多数时候应该这样做的一个很好的理由.然而,它可能只是一个我不习惯的编码习语.
所以除了检查nil之外,如此:
assert( object != nil );
[object message];
Run Code Online (Sandbox Code Playgroud)
有没有办法让运行时捕获这种情况,并警告何时object为零?
对我有耐心,我还在学习Cocoa Touch.其他-viewDidLoad没被称为问题与我的问题无关,我做了搜索.
我有FooViewController一个UIViewController子类.FooViewController.xib将其File's Owner设置为FooViewController.另外,我有Main,其App代表是MyApplication,其文件所有者是UIApplication.我的主要笔尖设置为Main.
我可以使用此流程(为简洁起见,代码剪切)使视图显示在屏幕上:
UIWindow *main;
-(void)applicationDidFinishLaunching:(UIApplication*)application {
[self showFooViewController];
[main makeKeyAndVisible];
}
-(void)showFooViewController {
fooViewController = [[FooViewController alloc] init];
if(![[NSBundle mainBundle] loadNibNamed:@"FooViewController" owner:fooViewController options:nil]) {
DebugF(@"Failed to load FooViewController");
return;
}
// Add the view and put it in place
UIView *view = [fooViewController view];
CGRect cur = [view frame];
cur.origin = CGPointMake(0.0f, 20.0f);
[view setFrame:cur];
[main addSubview:[fooViewController view]];
}
Run Code Online (Sandbox Code Playgroud)
但是,此消息未发送到FooViewController:
- (void) viewDidLoad {
DebugF(@"Hello!"); …Run Code Online (Sandbox Code Playgroud) 我在视图中有一个大小为320x218的UIView(下面的代码中的menuView).我想在此视图中加载导航控制器.我使用以下代码来做到这一点:
MenuViewController *menuController = [[MenuViewController alloc] initWithNibName:@"MenuViewController" bundle:nil];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:menuController];
navigationController.navigationBarHidden = YES;
[menuView addSubview:navigationController.view];
[menuController release];
[navigationController release];
Run Code Online (Sandbox Code Playgroud)
执行时,根视图不会显示在该视图中.仅显示导航栏,其余视图为空.
编辑:
我刚刚在MenuViewController的initWithNibName:和viewDidLoad中放置了一个NSLog().initWithNibName:中的那个被调用但viewDidLoad中的那个:不是:S
更新:
我试图推动menuController我的navigationController想法,因为它没有出现,它可能不在堆栈上.例外:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Pushing the same view controller instance more than once is not supported
Run Code Online (Sandbox Code Playgroud) 谢谢您阅读此篇.我想有一个函数Swift文件,我把我的项目的所有函数放入其中,其他Swift文件可以调用.我试图在函数文件中创建一个警报函数,当我传入一个特定的字符串时,它会显示一个特定的警报.当它在主文件中时它正在工作,但当我将它移动到函数文件时,presentViewController给我一个错误,说"使用未解析的标识符'presentViewController'." 请帮忙!这是我的代码:在函数文件中:
import Foundation
import UIKit
/**********************************************
Variables
***********************************************/
var canTapButton: Bool = false
var tappedAmount = 0
/**********************************************
Functions
***********************************************/
//the alert to ask the user to assess their speed
func showAlert(alert: String) -> Void
{
if(alert == "pleaseAssessAlert")
{
let pleaseAssessAlert = UIAlertController(title: "Welcome!", message: "If this is your firs time, I encourage you to use the Speed Assessment Tool (located in the menu) to figure which of you fingers is fastest!", preferredStyle: .Alert)
//ok button
let okButtonOnAlertAction …Run Code Online (Sandbox Code Playgroud)