2012-02-28 3 views
3

これは私にとってはまったく困惑しています。しかし、私は2つのペインを管理するView Controllerコンテナを作成しようとしています(SplitViewControllerに似ていますが、いくつかの重要な違いがあります)。私はやっとクラスを構築し始めてきたので、私は唯一の今3アイバーズを持っている:UIViewControllerのサブクラスはインスタンス変数を割り当てることができません

@implementation SplitViewController{ 
    BOOL _showLeftPane; 
    UIViewController *_leftController; 
    UIViewController *_rightController; 
} 

どんなに私は何をすべきか、私は_leftController IVARにビューコントローラを割り当てることはできません。ほとんどの場合、_rightControllerはiVarが割り当てることができます。それはより奇妙になる。私がiVarsの順序を切り替えると、_leContControllerの前に_rightControllerが現れるので、最初の試行でどちらかを割り当てることはできません。しかし、私が再び試みると(文字通り2回の課題を書く)、_leftControllerがかかります。一貫して、コンソールを使用して割り当て直後のiVar宣言にリストされている最初のコントローラの値を要求すると、値は(UIViewController *) $5 = 0x00000001 [no Objective-C description available]になります。 WTF?

好奇心から(私はほとんどクラスを書くことができなかったので)私はスーパービューをUIViewControllerからNSObjectに変更しました。私がそれをすると、割り当てが動作します。そして、実際には、このクラスのすべてが今すぐloadViewで空白のビューを作成するのと同じように割り当てられています。

私には何が欠けていますか?

更新 残りのコード:

全体.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、etc ...)が、私はこの問題を解決するまでコメントアウトしています。 また、ARCを使用しています。

アップデート2 私は多分それはアイバーズが問題を提起クラスのUIViewControllerのものとしなければならなかった考え、シンプルなNSObjectのコンテナクラスを設定しようとしました。しかし、同じ問題が続く。したがって、UIViewControllerを別の変数にラップしても機能しません。また、iVarタイプを 'id'に変更しようとしましたが、問題は解決しません。

私はプロジェクトをきれいにして、clangスタティックアナライザを使ってロジックエラーをチェックしていることにも気付きたいと思います。

アップデート3 、このクラスのすべての割り当ては、多くの場合...「オフ」(常にではないが)、リスト内の次のIVARを割り当てています。ダミーのid iVarsを入れて、ランダムなオブジェクトを割り当てました。

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]; 
    } 

これは(ない値が代入後に変更されませんが、ないものは持っている私が得たものである:私はその後、各割り当てを通じて段階(私は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 私はそれが動作するようになったが、唯一の私のデバイス上で。私は一般に、シミュレータ上で大きな変更を最初に(より簡単に/より速くデバッグするために)実装し、デバイスでの性能をテストする傾向があります。さらに、私は私の余暇時間にそれをテストすることができるように私のデバイス上の作業バージョンを持っていることを好む。だから私は私のデバイスにインストールし、クラスは正常に動作します。シミュレータで壊れているようだ。これがなぜ起こったのかについてのアイデアはありますか?私は本当にデバイス開発だけで残りのプログラム開発をテストする必要はありません。それは物事を少し遅くします。

+0

コードをいくつか追加できますか?上記の構文はうまくいくように見えるので、他のものでなければなりません。 –

+0

追加するコードはそれほど多くありませんが、1分後に追加します。 –

答えて

9

問題を見つけました。私はXcode 4.3を使用しています。これは、iOSでlldbデバッガを使用できるようになっているはずです(Appleが言うように)。デバッガをGDBに変更したところ、私の問題は解決しました。私は便利なデバッガを持っていますが、割り当てが実際に正しく機能していることがわかりました。デバッガは間違ったデータを吐き出していました。それは大好きです。

私のアドバイス:iOSでlldbを使用しないでください。 AppleはlldbデバッガをiOSで使うことができると言っていますが、依然として信頼できるほど安定していません。そう、ええ、私の人生の6時間を過ごした....私はAppleとバグを提出してきました

:10945570

UPDATE

AppleはXcodeの4.3.1でこれを固定しているようです。少なくとも、これまでLLDBは私のためにうまくいっています。

UPDATE 2

いいえ、用事、LLDBはまだシミュレータでめちゃめちゃにされています。

UPDATE 3

は、これまでのところ、私が言うことができるように、この問題は現在、4.3.2で解決されます。私はLLDBデバッガを約1週間使用していましたが、私はそれに私にゴミ値を与えることに何の問題もありませんでした。

+1

すべてのフォローアップを提供してくれてよかったです。 – blahdiblah

0

何らかの理由で#import <UIKit/UIKit.h>がプリコンパイルされたヘッダーにない場合は、そこに追加してみるか、単にファイルの上にインポートを追加してください。

+0

いい考えですが、それはあります。 –

2

このコードは正しいように見えるしません:

@interface SplitViewController : UIViewController 

@property (strong) UIViewController *leftViewController; 
@property (strong) UIViewController *rightViewController; 
@end 

.... 

@implementation SplitViewController{ 
    BOOL _showLeftPane; 
    UIViewController *_rightNavController; 
    UIViewController *_leftNavController; 
} 

が、これはあなたが本当に持っているものですか?私は.hの中でこのような何かを期待していたので:

@interface SplitViewController : UIViewController 
@property BOOL showLeftPane; 
@property (strong) UIViewController* leftViewController; 
@property (strong) UIViewController* rightViewController; 
@end 

そして.Mに明示的なバッキングを使用したい場合は

@implementation SplitViewController 
@synthesize showLeftPane; 
@synthesize leftViewController; 
@synthesize rightViewController; 
... 
@end 

それともから

@interface SplitViewController : UIViewController 
{ 
    BOOL _showLeftPane; 
    UIViewController* _leftViewController; 
    UIViewController* _rightViewController; 
} 

@property BOOL showLeftPane; 
@property (strong) UIViewController* leftViewController; 
@property (strong) UIViewController* rightViewController; 
@end 

.... 

@implementation SplitViewController 
@synthesize showLeftPane = _showLeftPane; 
@synthesize leftViewController = _leftViewController; 
@synthesize rightViewController = _rightViewController; 
... 
@end 

をvarsの投稿されたコードは、@interface@implementation

の間でコンセプトが混ざっているようです実際に私はおそらくそのバックを取るよ

@interface SplitViewController() 
{ 
    BOOL showLeftPane; 
    UIViewController* leftViewController; 
    UIViewController* rightViewController; 
} 
@end 

.... 

@implementation SplitViewController 
... 
@end 

:あなたはプライベートVARSをしたいならば、.mファイルのようなものでなければなりませんあなたのコメントを1として

、。それがvarsのために働いているかどうかは分かりませんが、メソッドの場合はそうです。あなたが作ることができ

はインターフェース

編集

私のミスで@privateを使用してプライベートvarsは。元のコードは正しいです。つまり、Xcode 4.2以来、iVarsをそのような実装ファイルに入れることができます。あなたの質問によれば、instance-variables-declared-in-objc-implementation-fileには4.2+とLLVMが必要です。

だから私は私が何を話しているのか分からないように聞こえる!

+0

私の質問で述べたように、プロパティを合成しようとしました。しかし、関係なく、私はトラブルシューティングとしてプロパティを使用していません。 initファイルに直接割り当てています。また、.hファイルにiVarsを持つ必要はありません。私はそれらが本質的に私的であるので、とにかく.mファイルでそれらを好む。いずれにせよ、私はそれらを.hファイルに入れてみました。同じ振る舞い。 –

+0

@AaronHayman私の答えの編集を参照してください –

+0

オクラ、キックのために私はそれを試しました。まだ動作しません。しかし、あなたがiVarsをカテゴリに入れたいと思う理由はわかりません。彼らは実装でうまく動作します。実際、このプロジェクトの私の100以上のクラスのすべては、実装にiVarsを持っています。私はあなたがそれを行うことができない時があったことを覚えていますが、客観的な - cは、今少しの間@implementationの中でiVar宣言を許しています。 –

関連する問題