18

質問があります。コードは次のとおりです。

@interface MyFoo : NSObject {
    NSString *nameStr;
}
@end
@implementation MyFoo
- (id)init {
    self = [super init];
    if (self) {
        self->nameStr = [@"some value of the string that is set right into the private ivar" copy];
    }
    return self;
}
@end

問題は、すべての C++ ルールを無視し、メモリ ダンプの脆弱性を無視することです。なぜ、このような矢印演算子の構文を使用してはいけないのでしょうか? アップルのドキュメントのどこかに、将来クラスが実行時の構造体へのポインタとは異なる方法で表現される可能性があるため、それが正しくないというルールがありますか?

前もって感謝します!

4

3 に答える 3

18

の使い方はself->someIvarと同じですsomeIvar。間違いではありませんが、必要でもありません。

矢印表記を使用するのはcopyWithZone:、プロパティを持たない ivar のそれぞれをコピーできるように、 の実装だけです。

SomeClass *someCopy = ...
someCopy->ivar1 = ivar1; // = self->ivar1
someCopy->ivar2 = ivar2; // = self->ivar2

そのような矢印演算子の構文を使用してはならないということをどこで見ていますか?

于 2012-12-17T18:26:29.207 に答える
5

プロパティにアクセスするために ivar 名だけで矢印表記を使用しても、それらが保持、割り当てなどになることは保証されません。

例:

@interface MyFoo : NSObject {
}
@property(nonatomic,retain)  NSString *nameStr;
@end
@implementation MyFoo
- (id)initWithString:(NSString *)name {
    self = [super init];
    if (self) {
        self->nameStr = name; // will not be retained
    }
    return self;
}
@end

すでに回答されているivar変数については、何も問題はありません。

于 2012-12-17T18:29:35.357 に答える
3

矢印表記の使用は間違っていません。矢印とドット表記には違いがあります。矢印演算子を使用するとインスタンス変数にアクセスし、ドット演算子を使用するとプロパティにアクセスします。
矢印表記を使用して構造体のメンバーにアクセスし、ドット表記を使用して構造体メンバーにアクセスする C 構造体のようには機能しません。だから私は重要な例を作るでしょう:

@property (nonatomic, strong) NSString *text;

.m ファイル内:

- (void)setText:(NSString *)string {
    NSLog(@"Accessing property");
    self->text = string; // let's suppose that text is not synthesized
}

ドット表記を使用すると、プロパティにアクセスすると、「Accessing property」と出力されますが、これは C 構造体構文とは関係ありません。

于 2012-12-17T18:26:02.193 に答える