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

Objectiv-Cの勉強を始めたばかりの者です。
プロパテイの機能を理解する為に以下のようなプログラムを書きました。

例1)まずは、プロパテイを使わない例です。
ーーーーーーー data.h ーーーーーーー
#import <Foundation/NSObject.h>
#import <Foundation/NSString.h>
@interface Data : NSObject {
NSString* str;
}
- (void)setStr:(NSString* )arg;
- (NSString*)retStr;
@end

ーーーーーーー data.m ーーーーーーー
#import "Data.h"
@implementation Data
- (NSString*) retStr{
return str;
}
- (void)setStr:(NSString*) arg{
[arg retain];
[str release];
str = arg;
}
@end

ーーーーーーー main.m ーーーーーーー
#import <stdio.h>
#import "Data.h"
int main(void) {
Data* data = [[Data alloc] init];
[data setStr:@"aaa"];
NSLog(@"%@",[data retStr]);
return 0;
}


例2)次に、プロパテイを使って例1を書き換えてみました。
ーーーーーーー data.h ーーーーーーー
#import <Foundation/NSObject.h>
#import <Foundation/NSString.h>
@interface Data : NSObject {
NSString* str;
}
@property (retain) NSString* str;
@end

ーーーーーーー data.m ーーーーーーー
#import "Data.h"
@implementation Data
@synthesize str;
@end

ーーーーーーー main.m ーーーーーーー
#import <stdio.h>
#import "Data.h"
int main(void) {
Data* test = [[Data alloc] init];
test.str = @"hoge";
NSLog(@"%@",test.str);
return 0;
}


例2を実行した結果、以下のように出力されました。

2010-02-05 22:17:50.696 data[1583:903] *** __NSAutoreleaseNoPool(): Object 0x100001068 of class NSCFString autoreleased with no pool in place - just leaking
2010-02-05 22:17:50.698 data[1583:903] hoge

@propertyのオプションを(retain) ではなく、(assign)に変更すると、
2010-02-05 22:30:02.271 data[1619:903] hoge
と出力されて、期待した結果が得られるのですが、なぜretainではダメなのでしょう?
また、assignでも例1のようなメモリ管理は自動的に行われているのでしょうか?

以上、ご指導の程、よろしくお願いいたします。

A 回答 (1件)

単に、NSAutoreleasePoolを生成してないからでは。


ソースとメッセージを見る限りですが。
    • good
    • 0
この回答へのお礼

osamuyさんご回答ありがとうございました。

以下のように修正したらなおりました。

#import <Foundation/Foundation.h>
#import <stdio.h>
#import "Data.h"
int main(void) {
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
Data* test = [[Data alloc] init];
test.str = @"hoge";
NSLog(@"%@",test.str);
[pool release];
return 0;
}

お礼日時:2010/02/06 21:28

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