- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
这让我非常困惑,让我觉得我错过了一些重要的东西。但是我正在尝试创建一个 View Controller 容器来管理两个 Pane (类似于 SplitViewController 但有一些重要的区别)。我才刚刚开始构建类(class),所以我现在只有 3 个 iVar:
@implementation SplitViewController{
BOOL _showLeftPane;
UIViewController *_leftController;
UIViewController *_rightController;
}
无论我做什么,我都无法将 View Controller 分配给 _leftController iVar。大多数情况下,_rightController iVar 可以分配。它变得更奇怪了。如果我切换 iVar 的顺序,使 _rightController 出现在 _leftController 之前,我无法在第一次尝试时分配任何一个。但是,如果我再试一次(字面上写了两次赋值),_leftController 将接受。一致地,当我在分配后立即使用控制台请求 iVar 声明中列出的第一个 Controller 的值时,我得到的值是 (UIViewController *) $5 = 0x00000001 [没有可用的 Objective-C 描述]
。什么鬼?
出于好奇(并且因为我可以......我才刚刚开始编写类),我将 super 从 UIViewController 更改为 NSObject。当我这样做时,分配工作。实际上,除了在 loadView 上创建一个空白 View 之外,赋值几乎就是这个类现在所做的所有事情。
我错过了什么?
更新其余代码:
整个.h文件:
#import <UIKit/UIKit.h>
@interface SplitViewController : UIViewController
@property (strong) UIViewController *leftViewController;
@property (strong) UIViewController *rightViewController;
@end
整个 .m 文件(注意,我已经尝试综合属性,相同的行为,只是它更难从控制台调试):
@implementation SplitViewController{
BOOL _showLeftPane;
UIViewController *_rightNavController;
UIViewController *_leftNavController;
}
#pragma mark - Init Methods
- (id)init{
if (self = [super initWithNibName:nil bundle:nil]){
_showLeftPane = YES;
}
return self;
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
}
return self;
}
#pragma mark - Properties
- (void) setLeftViewController:(UIViewController *)leftViewController{
_leftNavController = leftViewController;
}
- (UIViewController *) leftViewController{
return _leftNavController;
}
- (void) setRightViewController:(UIViewController *)rightViewController{
_rightNavController = rightViewController;
}
- (UIViewController *) rightViewController{
return _rightNavController;
}
最初,我覆盖了所有普通的 View Controller 方法(loadView、viewDidLoad 等),但我已经将它们注释掉,直到我可以解决这个问题。另外,我正在使用 ARC。
更新 2我已经尝试设置一个简单的 NSObject 容器类,认为它可能与 iVars 属于 UIViewController 类有关,这引起了问题。但同样的问题仍然存在。因此,将 UIViewController 包装到另一个变量中是行不通的。我也尝试将 iVar 类型更改为“id”,但问题仍然存在。
我还想指出,我已经清理了项目并使用 clang 静态分析器来检查逻辑错误。
更新 3此类中的所有分配都是“关闭”...经常(但不总是)分配列表中的下一个 iVar。我放入了一堆虚拟 id iVars 并为它们分配了随机对象。然后,我逐步完成每个赋值(我将其放入 init 中)并测试赋值前后的值:
if (self = [super initWithNibName:nil bundle:nil]) {
_showLeftPane = YES;
_dummy1 = [[NSObject alloc] init];
_dummy2 = [[UIView alloc] init];
_dummy3 = [[NSNumber alloc] init];
_dummy4 = [[NSString alloc] init];
_dummy5 = [[NSValue alloc] init];
_dummy6 = [[UIColor alloc] init];
_dummy7 = [[NSCache alloc] init];
_dummy8 = [[UIButton alloc] init];
_dummy9 = [[UIFont alloc] init];
_rightController = [[UIViewController alloc] init];
_leftController = [[UIViewController alloc] init];
}
这就是我得到的(不是赋值后值不会改变,而是那些确实有值的值通常来自之前的赋值)。 :
(lldb) po _showLeftPane
(BOOL) $2 = '\0' <nil>
(lldb) po _showLeftPane
(BOOL) $4 = '\0' <nil>
(lldb) po _dummy1
(id) $6 = 0x00000001 [no Objective-C description available]
(lldb) po _dummy1
(id) $8 = 0x00000001 [no Objective-C description available]
(lldb) po _dummy2
(id) $9 = 0x0a0461e0 <NSObject: 0xa0461e0>
(lldb) po _dummy2
(id) $11 = 0x0a0461e0 <NSObject: 0xa0461e0>
(lldb) po _dummy3
(id) $12 = 0x0866f340 <UIView: 0x866f340; frame = (0 0; 0 0); layer = <CALayer: 0xa05a790>>
(lldb) po _dummy3
(id) $14 = 0x0866f340 <UIView: 0x866f340; frame = (0 0; 0 0); layer = <CALayer: 0xa05a790>>
(lldb) po _dummy4
(id) $15 = 0x00000000 <nil>
(lldb) po _dummy4
(id) $17 = 0x00000000 <nil>
(lldb) po _dummy5
(id) $18 = 0x017c5a7c <object returned empty description>
(lldb) po _dummy5
(id) $20 = 0x017c5a7c <object returned empty description>
(lldb) po _dummy6
(id) $21 = 0x00000000 <nil>
(lldb) po _dummy6
(id) $23 = 0x00000000 <nil>
(lldb) po _dummy7
(id) $24 = 0x0865d300 <UIPlaceholderColor: 0x865d300>
(lldb) po _dummy7
(id) $26 = 0x0865d300 <UIPlaceholderColor: 0x865d300>
(lldb) po _dummy8
(id) $27 = 0x0a230af0 <NSCache: 0xa230af0>
(lldb) po _dummy8
(id) $29 = 0x0a230af0 <NSCache: 0xa230af0>
(lldb) po _dummy9
(id) $30 = 0x08637350 <UIButton: 0x8637350; frame = (0 0; 0 0); opaque = NO; layer = <CALayer: 0x8484920>>
(lldb) po _dummy9
(id) $32 = 0x08637350 <UIButton: 0x8637350; frame = (0 0; 0 0); opaque = NO; layer = <CALayer: 0x8484920>>
(lldb) po _rightController
(UIViewController *) $33 = 0x00000000 <nil>
(lldb) po _rightController
(UIViewController *) $35 = 0x00000000 <nil>
(lldb) po _leftController
(UIViewController *) $36 = 0x0a065180 <UIViewController: 0xa065180>
(lldb) po _leftController
(UIViewController *) $38 = 0x0a065180 <UIViewController: 0xa065180>
那么,呃...这是一个错误吗?如果是这样,我到底要怎么归档呢?我什至不知道发生了什么....
更新 4我让它工作,但只在我的设备上。我通常倾向于首先在模拟器上实现重大更改(更容易/更快地调试),然后测试它在设备上的性能。另外,我更喜欢在我的设备上安装一个工作版本,这样我就可以在业余时间进行测试。所以我将它安装在我的设备上,类(class)运行良好。它似乎只在模拟器中被破坏。关于为什么会这样的任何想法?我真的不想单独在设备上测试其余的程序开发。这会稍微减慢速度。
最佳答案
好的,我想出了问题。我正在使用 Xcode 4.3,它应该允许您在 iOS 中使用 lldb 调试器(或者 Apple 这么说)。当我将调试器更改为 GDB 时,我的问题就消失了。虽然现在我有了一个有用的调试器,但我已经意识到这些分配实际上工作正常。调试器只是吐回不正确的数据。必须喜欢它。
我的建议:不要在 iOS 上使用 lldb。尽管 Apple 表示 lldb 调试器可以与 iOS 一起使用,但它仍然不够稳定,无法依赖。所以,是的,我的生命已经过去了 6 个小时......
我已向 Apple 提交错误:10945570
更新
Apple 似乎已在 Xcode 4.3.1 中修复此问题。至少,到目前为止,LLDB 对我来说运行良好。
更新 2
不,没关系,LLDB 在模拟器中仍然一团糟。
更新 3
据我所知,这个问题现在已在 4.3.2 中得到解决。我现在已经使用 LLDB 调试器大约一个星期了,我没有遇到任何问题,它给我垃圾值。
关于objective-c - UIViewController 子类无法分配实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9482689/
我遵循了一本名为“Sitepoint Full Stack Javascript with MEAN”的书中的教程,我刚刚完成了第 6 章,应该已经创建了一个带有“数据库”的“服务器”。数据库只不过是
在 Jquery 中,我创建两个数组,一个嵌入另一个数组,就像这样...... arrayOne = [{name:'a',value:1}, {name:'b',value:2}] var arra
这个问题在这里已经有了答案: What is the explanation for these bizarre JavaScript behaviours mentioned in the 'Wa
我被放在别人的代码上,有一个类用作其他组件的基础。当我尝试 ng serve --aot(或 build --prod)时,我得到以下信息。 @Component({ ...,
我正在测试一些代码,并使用数据创建了一个 json 文件。 问题是我在警报中收到“[object Object],[object Object]”。没有数据。 我做错了什么? 这是代码:
我想打印 [object Object],[object Object] 以明智地 "[[{ 'x': '1', 'y': '0' }, { 'x': '2', 'y': '1' }]]"; 在 ja
我有一个功能 View ,我正在尝试以特殊格式的方式输出。但我无法让列表功能正常工作。 我得到的唯一返回是[object Object][object Object] [object Object]
在使用优秀的 Sim.js 和 Three.js 库处理 WebGL 项目时,我偶然发现了下一个问题: 一路走来,它使用了 THREE.Ray 的下一个构造函数: var ray = new THRE
我正在使用 Material UI 进行多重选择。这是我的代码。 {listStates.map(col => (
我的代码使用ajax: $("#keyword").keyup(function() { var keyword = $("#keyword").val(); if (keyword.
我遇到了下一个错误,无法理解如何解决它。 Can't resolve all parameters for AuthenticationService: ([object Object], ?, [o
我正在尝试创建一个显示动态复选框的表单,至少应选中其中一个才能继续。我还需要获取一组选中的复选框。 这是组件的代码: import { Component, OnInit } from '@angul
我正在开发 NodeJs 应用程序,它是博客应用程序。我使用了快速验证器,我尝试在 UI 端使用快速闪存消息将帖子保存在数据库中之前使用闪存消息验证数据,我成功地将数据保存在数据库中,但在提交表单后消
我知道有些人问了同样的问题并得到了解答。我已经查看了所有这些,但仍然无法解决我的问题。我有一个 jquery snipet,它将值发送到处理程序,处理程序处理来自 JS 的值并将数据作为 JSON 数
我继承了一个非常草率的项目,我的任务是解释为什么它不好。我注意到他们在整个代码中都进行了这样的比较 (IQueryable).FirstOrDefault(x => x.Facility == fac
我只是在删除数组中的对象时偶然发现了这一点。 代码如下: friends = []; friends.push( { a: 'Nexus', b: 'Muffi
这两个代码片段有什么区别: object = nil; [object release] 对比 [object release]; object = nil; 哪个是最佳实践? 最佳答案 object
我应该为其他人将从中继承的第一个父对象传递哪个参数,哪个参数更有效 Object.create(Object.prototype) Object.create(Object) Object.creat
我在不同的对象上安排不同的选择器 [self performSelector:@selector(doSmth) withObject:objectA afterDelay:1]; [self per
NSLog(@"%p", &object); 和 NSLog(@"%p", object); 有什么区别? 两者似乎都打印出一个内存地址,但我不确定哪个是对象的实际内存地址。 最佳答案 这就是我喜欢的
我是一名优秀的程序员,十分优秀!