電子書籍の厳選無料作品が豊富!

objective-C(Xcode)に関して質問があります。

新規プロジェクトからview-base Applicationテンプレートを使用してプロジェクト(TestClass.xcodeproj)を作成します。
そうすると、TestClassAppDelegate.m, TestClassAppDelegate.h, TestClassViewController.h, TestClassViewController.mが
Classesフォルダーに作成されます。このプロジェクトに自分で作成するクラス(MyTestClass)を追加するにはどうすれば良いのでしょうか?

下記のコードではエラーはでませんが、tc.counterにint 10が代入さず、0(nil)が出力されます。
(interfacebuilder でボタンのみ設置、ボタンを押すとpushが呼ばれ、logを残す)

===MyTestClass.h=====

#import <Foundation/Foundation.h>

@interface TestClass : NSObject {
int counter;
}

@property int counter;

@end

===MyTestClass.m=====
#import "TestClass.h"

@implementation TestClass

@synthesize counter;

-(int)calcPlus{
return counter = counter+10;
}

@end

===TestClassViewController.h====
#import <UIKit/UIKit.h>
#import "TestClass.h"

@interface TestClassViewController : UIViewController {
TestClass *tc;
}

-(IBAction) push;
-(void)calc;

@end

===TestClassViewController.m===
#import "TestClassViewController.h"
#import "TestClass.h"

@implementation TestClassViewController

-(IBAction)push{
tc.counter = 10;
NSLog(@"%d", tc.counter);

}

サンプルコード(iPhoneUnitTests ((calc)))をみても、特別なことはなく、ヘッダーの読み込みさえ出来てれば
クラスが使えそうなのですが・・・。

コメントをいただければ、幸いです。

A 回答 (3件)

> URLは下記の通りです。



リンク先の中の「CClasses/CalcViewController.m」。
メソッド「- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil」に記述されている、「_calculator = [Calculator new];」。
その「new」が、インスタンス生成+初期化メソッドです。
詳しくは、NSObjectのリファレンスで、クラスメソッド「new」を調べてください。

※私が勉強したサンプルコードで、newを使っているのは、珍しいです。ほとんどくそまじめに「[[ClassName alloc] init]」と記述しています。そもそもinitで初期化するケースが少なく、「[[NSView alloc] initWithFrame: ~]」のような、クラス独自の初期化メソッドを使っているからだと思いますが……
    • good
    • 0
この回答へのお礼

早速調べてみます。
ありがとうございました。

お礼日時:2010/06/07 06:45

> サンプルコード(calculator クラス)にはこの記述がなかったのですが、


> そのわけはなぜでしょうか。

そのサンプルコードを見ないと、なにも答えられません。
Apple提供のサンプルコードなら、Appleのデベロッパー向けサイトからすべてダウンロード可能なので、探し出して、URLを記述してください。

※allocしたインスタンスは、どこか不用になった時点でreleaseしてください。あるいはautoreleaseしてください。
    • good
    • 0
この回答へのお礼

すみません。
URLは下記の通りです。
https://developer.apple.com/iphone/library/sampl …

もう少しお教えいただければ幸いです。

お礼日時:2010/06/05 05:53

インスタンスtcが生成されてません。


allocで生成し、initで初期化しないと、インスタンスは機能しません。
ただ「TestClass *tc;」と宣言するだけでは、だめです。

(ほかにも、怪しいコードがあるんですが……)

この回答への補足

早速の回答ありがとうございました。
サンプルコードを確認してみます。

補足日時:2010/06/04 06:05
    • good
    • 0
この回答へのお礼

push関数に以下のコードを追加しました。

tc = [[TestClass alloc]init];

とりあえず、代入はできました。
ありがとうございました。

サンプルコード(calculator クラス)にはこの記述がなかったのですが、
そのわけはなぜでしょうか。
(良く構造から見てみると、私のと違うのはわかりましたが・・・)

お礼日時:2010/06/04 18:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!