这让我感到非常困惑,让我觉得我错过了一些必不可少的东西.但我正在尝试创建一个视图控制器容器来管理两个窗格(类似于SplitViewController,但有一些重要的区别).我几乎没有开始构建课程,所以我现在只有3个iVars:
@implementation SplitViewController{
BOOL _showLeftPane;
UIViewController *_leftController;
UIViewController *_rightController;
}
Run Code Online (Sandbox Code Playgroud)
无论我做什么,我都无法将视图控制器分配给_leftController iVar.大多数情况下,_rightController iVar可以分配.它变得怪异了.如果我切换iVars的顺序,所以_rightController出现在_leftController之前,我不能在第一次尝试时分配任何一个.但是,如果我再次尝试(字面上写两次赋值),_leftController将采取.一直以来,当我使用控制台在分配后立即请求iVar声明中列出的第一个控制器的值时,我得到的值是(UIViewController *) $5 = 0x00000001 [no Objective-C description available].WTF?
出于好奇(因为我可以...我几乎没有开始编写类)我将super从UIViewController更改为NSObject.当我这样做时,分配工作.实际上,除了在loadView上创建一个空白视图之外,赋值就是这个类现在所做的一切.
我错过了什么?
更新 代码的其余部分:
整个.h文件:
#import <UIKit/UIKit.h>
@interface SplitViewController : UIViewController
@property (strong) UIViewController *leftViewController;
@property (strong) UIViewController *rightViewController;
@end
Run Code Online (Sandbox Code Playgroud)
整个.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 = …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建自己的自定义断言.但是,我希望我的断言自动包含所有相关变量.这对我来说似乎非常基础,我已经搜索了大约一个小时,但我似乎无法找到一种方法来访问所有相关的堆栈帧变量.有谁知道如何获得这些变量?
仅供参考 - 我不需要访问调试器中的变量,我需要以编程方式访问它们.我想将它们与崩溃报告一起上传,以便向我提供有关崩溃的更多信息.我也知道我可以手动打印出来......这正是我想要避免的.
我有两个枚举:
public enum ServerState {
case Connecting
case Open
case LoggedIn
case Closed
case Error(NSError)
}
enum TransportLayerState {
case Disconnected(NSError?)
case Connecting
case Connected
}
Run Code Online (Sandbox Code Playgroud)
我需要在它们之间切换,如果ServerState设置为基础TL状态不可能的状态,则返回'false'.例如,如果是,它将返回false serverState == .Open && tlState == .Disconnected.我正在尝试使用switch语句执行此操作,但我发现我真正想要的是匹配其中一个状态不是特定状态的情况.例如:
switch (serverState, tlState) {
case (.Connecting, !.Connecting): return false
case (.Closed, !.Disconnected(.None)): return false
case (.Error(_), !.Disconnected(.Some(_)): return false
case (.Open, !.Connected), (.LoggedIn, !.Connected): return false
default: return true
}
Run Code Online (Sandbox Code Playgroud)
显然这不起作用,因为你不能放在!案例陈述之前.我唯一的另一种选择是指定所有允许的案例,这些案例要多得多.指定限制并允许所有其他状态组合更有意义,但我不知道如何执行此操作.有任何想法吗?我也试图避免嵌套的switch语句.
注意:我知道我可以使用Swift 2进行此操作if case,但我现在不能使用Swift 2,因为这是生产代码.所以请回答Swift 1.2中的解决方案.
我有一个看起来像UIViewController的奇怪(非?)问题.看起来控制器在取消分配时不会释放其子视图.我将NSLog消息放在所有子视图的dealloc方法以及视图控制器中.视图控制器dealloc被调用,但子视图没有.但是,如果我然后将该视图控制器的另一个实例推送到导航堆栈,则会显示之前实例的所有子视图都会被释放(我在控制台中收到一堆NSLog消息让我知道).我已经检查过,并且我没有单独引用显示视图控制器中的自定义视图控制器(正在进行推送的控制器).
一个小的(可能)细节:自定义视图控制器确实接收它存储的块,然后在弹出之前执行.但是,我确实发送了nil并且我得到了同样的行为.另外,当弹出堆栈时,呈现视图控制器会释放dealloc,因此没有保留周期.
此外,我确实尝试在自定义视图控制器的dealloc方法中显式释放每个视图.相同的行为.
导航控制器是否可能坚持下去?它似乎不会对我的任何其他视图控制器执行此操作.
我的问题是,这确实代表了内存泄漏(所有这些子视图); 虽然泄漏没有堆积,但它仍然是泄漏.