※ ChatGPTを利用し、要約された質問です(原文:【Objective-C】プロパテイについて)
プロパテイとは?Objective-Cでの使い方とメモリ管理について
このQ&Aのポイント
Objective-Cの勉強を始めたばかりの者です。プロパテイの機能を理解する為に以下のようなプログラムを書きました。
例1では、プロパテイを使わない方法を示し、例2ではプロパテイを使った書き方を紹介しました。
例2の実行結果では、retainとassignの差異により、期待した結果を得られない問題があるようです。メモリ管理についても疑問があります。
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のようなメモリ管理は自動的に行われているのでしょうか?
以上、ご指導の程、よろしくお願いいたします。
お礼
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; }