gpt4 book ai didi

objective-c - UIViewController 子类无法分配实例变量

转载 作者:可可西里 更新时间:2023-11-01 06:21:10 25 4
gpt4 key购买 nike

这让我非常困惑,让我觉得我错过了一些重要的东西。但是我正在尝试创建一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com