2

Simple question I can't seem to find a fast post for;

if I have an object, lets say:

 NSString *myString_;
 @property(readwrite, retain)NSString* myString;
 @synthesize myString = myString_; 

When I synthesize this, does this alloc memory for the object?

Thanks

4

3 に答える 3

2

@synthesizeが行うのは、プロパティのアクセサー(セッターとゲッター)を生成し、同じ名前のインスタンス変数を作成することだけです。等号を使用する追加の手順:

@synthesize mystring = _string;

...インスタンス変数の名前を_stringに変更します(または、選択した名前に関係なく、アンダーバーは単なるアップルの慣例です)。インスタンス変数にアクセサーと同じ名前を共有させると問題が発生する可能性があるため、これは良い習慣です。アンダーバーがあると、2つを区別できます。

これは基本的に生成されるものです(ARCがオンであると仮定します):

// getter
- (NSString*)mystring
{
    return _string;
}

// setter
- (void)setMyString:(NString*)myString
{
    _myString = myString;
}

(self.propertyNameを使用して)initメソッドでプロパティを初期化できます。

-(id)init
{
    self.myString = @"Something"; // or use an alloc init method in the class   
}

または、次のようにゲッターをオーバーライドすることで、遅延して初期化できます。

- (NSString*)myString
{
    if (!_myString) {  // same as saying if nil and therefore doesn't exist yet
        _myString = @"Something";
    }
    return _myString;
}

また、変数を個別に宣言する必要がないことにも注意してください(つまり、NSString * mystringは必要ありません)。プロパティを宣言するときは、retainの代わりにstrongまたはweakを使用してください。

インスタンス変数に直接アクセスする必要があるのはアクセサーだけです。これにより、単一のゲートウェイを介してインスタンス変数へのすべてのアクションを制御できます。クラス内でアクセサー(つまり、self.mystring)を使用するオーバーヘッドはごくわずかです。もちろん、このようにする必要はありませんが、それは良い習慣です。

于 2012-06-04T19:06:30.103 に答える
2

No. You'll either alloc & init an object and then set the property to it, ala:

self.myString = [[NSString alloc] initWithString: @"Hello Miek"];

or you'll have an already allocated & retained string which you'll set your new property to.

于 2012-06-04T18:41:05.673 に答える
1

To answer your question: No, the property and synthesize call won't allocate any memory. You have to do it. If you don't, the myString actually points to nil upon construction. Don't use Michael's example though, as it leaks memory.

Use

self.myString = @"Hello Miek";

The @ literal is actually equivalent to calling [NSString stringWithString:] class method which returns an autoreleased (and of course allocated) object. Alternatively you could use this

NSString *aString = [[NSString alloc] initWithString: @"string...."];
self.myString = aString;
[aString release];

Also note, you should declare the property as copy instead of retain for NSStrings. In your dealloc, you have to release myString too.

And finally, Patrick's answer isn't 100% correct, since the synthesised setter for the retained property looks like this:

-(void) setMyString: (NSString*) string {
    [myString release];
    myString = [string retain];
 }

And on a final note related to Patrick's answer, it is not recommended to use setters in the init method. So rather than

self.myString = @"xyz";

It is recommended to access the iVar directly:

//or _myString, if you synthesized it that way of course
myString = @"xyz";
[myString retain];

Cheers (long answer, had a little time on my hand ;)

于 2012-06-05T19:54:23.273 に答える