2012-05-05 7 views
1

オブジェクト自体を削除せずに別の配列のオブジェクトを指すNSMutableArrayのポインタを削除しようとしています。例:上記のコードでオブジェクトを保持したままNSMutableArrayからオブジェクトへのポインタを削除しますか?

// In ViewController.m – Code abridged and somewhat simplified 

@interface ViewController() 
@property (nonatomic, strong) NSMutableArray *objectPool; 
@property (nonatomic, strong) NSMutableArray *objectsOwnedByFriend; 
@property (nonatomic, strong) NSMutableArray *objectsOwnedByMe; 
- (void)transferPointerToObjectFromFriendToMe; 
- (void)copyPointerToObjectFromFriendToMe; 
@end 

@implementation ViewController 

@synthesize objectPool = _objectPool; 
@synthesize objectsOwnedByFriend = _objectsOwnedByFriend; 
@synthesize objectsOwnedByMe = _objectsOwnedByMe; 

- (void)setObjectPool:(NSMutableArray *)objectPool 
{ 
    _objectPool = objectPool; 
} 

- (NSMutableArray *)objectPool 
{ 
    if (!_objectPool) _objectPool = [[NSMutableArray alloc] initWithArray:self.objects]; // self.objects is a mutable array containing multiple NSObjects 
    return _objectPool; 
} 

- (void)setObjectsOwnedByFriend:(NSMutableArray *)objectsOwnedByFriend 
{ 
    _objectsOwnedByFriend = objectsOwnedByFriend; 
} 

- (NSMutableArray *)objectsOwnedByFriend 
{ 
    if (!_objectsOwnedByFriend) 
    { 
     _objectsOwnedByFriend = [[NSMutableArray alloc] init]; 
     [_objectsOwnedByFriend addObjectsFromArray:self.objectPool]; 
    } 
    return _objectsOwnedByFriend; 
} 

- (void)setObjectsOwnedByMe:(NSMutableArray *)objectsOwnedByMe 
{ 
    _objectsOwnedByMe = objectsOwnedByMe; 
} 

- (NSMutableArray *)objectsOwnedByMe 
{ 
    if (!_objectsOwnedByMe) _objectsOwnedByMe = [[NSMutableArray alloc] init]; 
    return _objectsOwnedByMe; 
} 

- (void)transferPointerToObjectFromFriendToMe 
{ 
    [self.objectsOwnedByMe addObject:[self.objectsOwnedByFriend lastObject]]; 
    [self.objectsOwnedByFriend removeLastObject]; 
} 

- (void)copyPointerToObjectFromFriendToMe 
{ 
    [self.objectsOwnedByMe addObject:[self.objectsOwnedByFriend lastObject]]; 
} 

@end 

、IはtransferPointerToObjectFromFriendToMeを使用する場合、最後のオブジェクトを削除するself.objectPoolにself.objectsOwnedByFriendにそれへのポインタ(Iが望むように)、またオブジェクト自体の両方を除去(これはI したくない)。

実際のオブジェクトのすべてを含む配列(self.objectPool)と、self.objectPool内のオブジェクトへのポインタを含む2つの可変配列(self.objectsOwnedByFriendとself.objectsOwnedByMe)と、 self.objectPool内のオブジェクトを参照するポインタを、self.objectsOwnedByFriendおよびself.objectsOwnedByMeに追加して削除します。また

、私はtransferPointerToObjectFromFriendToMeまたはcopyPointerToObjectFromFriendToMeのいずれかを使用して、オブジェクトが0ではなく
1の溶液中のself.objectsOwnedByMe.count結果を経由して、その後のチェックとして、適切に追加されていないようです=私の怠惰なインスタンス化self.objectsOwnedByMeが私の元のコードで行方不明になったために:

NSLog(@"self.objectsOwnedByMe = %@", self.objectsOwnedByMe); 

**私の最初のStackOverflowの質問:S
私は経由self.objectsOwnedByMeが適切に作成されたかどうかを確認することができました! **私は、私が古いスレッドを見逃した場合、似たような質問を見つけられなかったので、謝罪しています。診断するためにさらに情報が必要な場合はお知らせください。 (私はObj-Cを勉強しようとしています)

+0

解決策を含めるために元の質問を編集する代わりに、実際に回答を提出し、その回答を選択済みとしてマークする必要があります。 googleから来る答えを探している人の視点から考えてみましょう。彼らはよく尋ねられた質問と答えを受け入れているのが好きです。 – slayton

+0

さようなら、ようこそ、あなたのご滞在をお楽しみください。 – slayton

+0

今私は見る...ページの下部に隠されて!ありがとう。 –

答えて

1

Typo:P申し訳ありません。 Xcodeで私の実際のコードでは私が持っていた:

- (void)setObjectPool:(NSMutableArray *)objectPool 
{ 
    _objectPool = objectPool; 
} 

- (NSMutableArray *)objectPool 
{ 
    if (!_objectPool) _objectPool = [[NSMutableArray alloc] initWithArray:self.objects]; 
    return _objectsOwnedByFriend; 
} 

が、私は私のミスは超明白だと思う(とされていない場合、ミスが objectPoolのための私のゲッターは私が何とか逃した _objectsOwnedByFriend ...コピー/ペースト、エラーを返していましたしていること)。

すべて動作します。

0

これは非常に独特で混乱するコードです。私は、何かがセッターの1つ、-setObjectPool:または-setObjectsOwnedByFriend:を他のオブジェクトの配列と呼んでいることが問題だと思う。これらの設定者は、単純にivarを渡されたオブジェクトを参照するようにします。そのため、オブジェクトは共有されることになりがちです。

通常、そのようなプロパティは宣言され、copyセマンティクスで実装されます。

+0

こんにちはKen:私はまだあなたが何を意味するのか少し混乱しています。私はオブジェクトを "共有"したいと思っています。私は、実際のオブジェクト( 'self.objectPool')とそれらのオブジェクトを参照する他の配列(' self.objectsOwnedByFriend'、 'self.objectsOwnedByMe')を含むソース配列を、それらの上で何の操作も必要としません。 「コピー」は唯一の方法だと言っていますか?実際のオブジェクトをコピーすることなくこれを行う方法がなければなりません(例えば、オブジェクトが非常に大きい場合、または1つのオブジェクトが必要な場合は、それを指すすべてのオブジェクトに影響を与えます)。 –

+0

私があなたを理解していれば、独立した配列が必要ですが、配列が要素と同じオブジェクトを指しているようにしたいとします。私が言っているのは、おそらく独立した配列を持っていないということです。あなたはおそらく、複数のイーバルズが同じアレイを指し示していると思われます。配列をコピーすると、それは浅いコピーです。あなたは新しい配列を取得しますが、コピーされた配列と同じ要素を指しています。これはあなたが望むものです。 –

+0

こんにちはケン:説明をありがとう。私の問題は 'addObject:'であるようです。これは全く新しい一連の質問をもたらすので、新しいスレッドを開始し、新しいスレッドがこれらのコメントに新しい質問をするのではなく、このスレッドを解決します。 –

0

self.objectsOwnedByMeは初期化されていないようですので、実際のNSMutableArrayの代わりにnilを使用しています。

どこか(おそらくobjectsOwnedByMeのカスタムゲッターで以下のように?)あなたは、あなたがそれを使用して開始する前に配列を作成する必要があります。

- (NSMutableArray *)objectsOwnedByMe { 
    if (_objectsOwnedByMe == nil) { 
     _objectsOwnedByMe = [[NSMutableArray alloc] init]; 
    } 
    return _objectsOwnedByMe; 
} 

これは、両方の問題を説明するだろう:それは保持されませんnilあるので、したがって、他の配列から削除されたときには消えてしまいます。また、_objectsOwnedByMe配列には追加されません。

+0

申し訳ありませんが、それは実際にコード内にありました!私はself.objectsOwnedByMeのセッターとゲッターを含むように質問を更新しました:S –

関連する問題