id obj = [super myTestClassWithMessage:str];スーパークラスのコンビニエンスコンストラクタを呼び出してインスタンスを作り、それにsetMessage2:で2つ目のメッセージを追加しています。継承を使っていますので、こんな具合にスーパークラスにあるメソッドをすべて利用出来るのですね。またmyTestClassWithMessage:メソッド内ではmessageインスタンス変数に値を設定していますから、つまりmessageもちゃんと利用できていることがわかります。
[obj setMessage2:str2];
return obj;
@autoreleasepool {
obj = [[self alloc] init];
}この@autoreleasepoolというのは、オートリリースプールにオブジェクトを追加するのに用意されているものです。Xcode 4.2より、ARCがサポートとなり、NSAutoreleasePoolの利用が禁止されました。が、このメソッドのように、クラスメソッド内でインスタンスを生成しreturnするような場合、ARCではオブジェクトの参照カウントが追いきれません。こうした場合、@autoreleasepoolを使い、明示的にオートリリースプールへ追加します。Object 〇〇 of class クラス autoreleased with no pool in place
- just leaking - break on objc_autoreleaseNoPool() to debug
※リストが表示されない場合
AddBlockなどの広告ブロックツールがONになっているとリストなどが表示されない場合があります。これらのツールをOFFにしてみてください。
※MyTestClass.hの内容
#import <Foundation/Foundation.h>
@interface MyTestClass : NSObject {
NSString* message;
}
+(MyTestClass*)myTestClassWithMessage:(NSString*)str;
-(void)setMessage:(NSString*) str;
-(NSString*)message;
-(void)printMessage;
@end
@interface SuperMyTestClass : MyTestClass {
NSString* message2;
}
+(SuperMyTestClass*)superMyTestClassWithMessage:(NSString*) str
andMessage2:(NSString*) str2;
-(NSString*)message2;
-(void)setMessage2:(NSString*) str;
@end
※MyTestClass.mの内容
#import "MyTestClass.h"
@implementation MyTestClass
+(MyTestClass*)myTestClassWithMessage:(NSString*) str {
MyTestClass* obj;
@autoreleasepool {
obj = [[self alloc] init];
}
[obj setMessage:str];
return obj;
}
-(void)setMessage:(NSString*) str {
message = str;
}
-(NSString*)message {
return message;
}
-(void)printMessage {
NSLog(@"%@",message);
}
@end
@implementation SuperMyTestClass
+(SuperMyTestClass*)superMyTestClassWithMessage:(NSString*) str
andMessage2:(NSString*) str2 {
id obj = [super myTestClassWithMessage:str];
[obj setMessage2:str2];
return obj;
}
-(NSString*)message2 {
return message2;
}
-(void)setMessage2:(NSString*) str {
message2 = str;
}
-(void)printMessage {
NSLog(@"%@. %@",message,message2);
}
@end
※main関数の内容
int main (int argc, const char * argv[]) {
MyTestClass* obj = [MyTestClass
myTestClassWithMessage:@"This is First Object!!"];
[obj printMessage];
SuperMyTestClass* obj2 = [SuperMyTestClass
superMyTestClassWithMessage:@"This is Second Object!!"
andMessage2:@"It's SUPER!!!"];
[obj2 printMessage];
return 0;
}
| << 前へ | 次へ >> |