0

これは単純な問題だと思いますが、どういうわけかコアデータにオブジェクトがリークしています。コアデータには単純な1対1の関係があります。

       Person           <-------->         Address

        -name                                -city
        -email                               -country

人物モデルは比較的単純で、属性はほとんどありませんでした。しかし、Personクラス自体から都市と国にアクセスするために、Personクラスにゲッターを追加したかったのです。だから、私は次のようなことをしました、

@interface Person:NSManagedObject
    @property(nonatomic, strong) NSString *name;
    @property(nonatomic, strong) NSString *email;
    @property(nonatomic, strong) Address *address;
    -(NSString*)city;
    -(NSString*)country;
@end


@implementation Person
  -(NSString*)city{
     [self willAccessValueForKey:@"address"];
     NSString *c = [self valueForKeyPath:@"address.city"];
     [self didAccessValueForKey:@"address"];
   }

   -(NSString*)country{
     [self willAccessValueForKey:@"address"];
     NSString *c = [self valueForKeyPath:@"address.country"];
     [self didAccessValueForKey:@"address"];
   }

@end

これらのゲッターを使用すると、Personモデルの単純なゲッターだけで街にアクセスできます。

    person.city   and  person.country

しかし、これは正しい方法ではないと思います。この機能を実装して、メモリがリークされないようにするにはどうすればよいですか。

4

3 に答える 3

1

Personから直接都市や国にアクセスすることはできません。次のようにアクセスできます。

Person.Address.city
Person.Address.country

実装する必要はありません:

-(NSString*)city;
-(NSString*)country;
于 2012-09-11T14:30:32.213 に答える
1

コード内のreturnステートメントを忘れましたが、実際に使用しているコードに含まれていると思います。

コード自体にリークは見られません。ただし、Core Dataの関係は本質的に保持サイクルを作成するため、実行時にすべてに障害が発生する責任があることに注意してください。コアデータと保持サイクルを参照してください

于 2012-09-11T16:12:02.913 に答える
1

ガニーが言うように、あなたはただアクセスすることができます

person.address.city

ただし、cityメソッドがどうしても必要な場合は、生成されたプロパティを使用する必要があります。

- (NSString*)city {
    return address.city;
}

これはあなたの関係へのアクセスを隠しますが、それがあなたが望むものであることを確認してください。

メモリリークに関しては、新しいプロジェクトにARCを使用しないという本当に本当に本当に良い理由が必要です。

于 2012-09-11T16:14:39.870 に答える