小编Aar*_*man的帖子

UIViewController子类不能赋值实例变量

这让我感到非常困惑,让我觉得我错过了一些必不可少的东西.但我正在尝试创建一个视图控制器容器来管理两个窗格(类似于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)

subclass objective-c uiviewcontroller ios

3
推荐指数
1
解决办法
2991
查看次数

以编程方式获取objective-c中的所有帧变量

我正在尝试创建自己的自定义断言.但是,我希望我的断言自动包含所有相关变量.这对我来说似乎非常基础,我已经搜索了大约一个小时,但我似乎无法找到一种方法来访问所有相关的堆栈帧变量.有谁知道如何获得这些变量?

仅供参考 - 我不需要访问调试器中的变量,我需要以编程方式访问它们.我想将它们与崩溃报告一起上传,以便向我提供有关崩溃的更多信息.我也知道我可以手动打印出来......这正是我想要避免的.

objective-c

3
推荐指数
1
解决办法
352
查看次数

Swift Switch案例"不"

我有两个枚举:

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中的解决方案.

switch-statement swift

3
推荐指数
1
解决办法
1119
查看次数

UIViewController在dealloc时不释放子视图(使用ARC)

我有一个看起来像UIViewController的奇怪(非?)问题.看起来控制器在取消分配时不会释放其子视图.我将NSLog消息放在所有子视图的dealloc方法以及视图控制器中.视图控制器dealloc被调用,但子视图没有.但是,如果我然后将该视图控制器的另一个实例推送到导航堆栈,则会显示之前实例的所有子视图都会被释放(我在控制台中收到一堆NSLog消息让我知道).我已经检查过,并且我没有单独引用显示视图控制器中的自定义视图控制器(正在进行推送的控制器).

一个小的(可能)细节:自定义视图控制器确实接收它存储的块,然后在弹出之前执行.但是,我确实发送了nil并且我得到了同样的行为.另外,当弹出堆栈时,呈现视图控制器会释放dealloc,因此没有保留周期.

此外,我确实尝试在自定义视图控制器的dealloc方法中显式释放每个视图.相同的行为.

导航控制器是否可能坚持下去?它似乎不会对我的任何其他视图控制器执行此操作.

我的问题是,这确实代表了内存泄漏(所有这些子视图); 虽然泄漏没有堆积,但它仍然是泄漏.

iphone objective-c ios automatic-ref-counting

1
推荐指数
1
解决办法
2395
查看次数