copyWithZoneを実装する際のベストプラクティス。
2023-09-23 05:34:25
質問
の実装について、頭の中のいくつかのことを整理しようとしています。
copyWithZone:
を実装することについて、いくつかのことを整理しようとしています。
// 001: Crime is a subclass of NSObject.
- (id)copyWithZone:(NSZone *)zone {
Crime *newCrime = [[[self class] allocWithZone:zone] init];
if(newCrime) {
[newCrime setMonth:[self month]];
[newCrime setCategory:[self category]];
[newCrime setCoordinate:[self coordinate]];
[newCrime setLocationName:[self locationName]];
[newCrime setTitle:[self title]];
[newCrime setSubtitle:[self subtitle]];
}
return newCrime;
}
// 002: Crime is not a subclass of NSObject.
- (id)copyWithZone:(NSZone *)zone {
Crime *newCrime = [super copyWithZone:zone];
[newCrime setMonth:[self month]];
[newCrime setCategory:[self category]];
[newCrime setCoordinate:[self coordinate]];
[newCrime setLocationName:[self locationName]];
[newCrime setTitle:[self title]];
[newCrime setSubtitle:[self subtitle]];
return newCrime;
}
001で
-
クラス名を直接記述するのがベストでしょうか
[[Crime allocWithZone:zone] init]
を使うべきでしょうか?[[[self Class] allocWithZone:zone] init]
? -
を使用しても良いのでしょうか?
[self month]
を使ってもいいのでしょうか?それともiVarsに直接アクセスしたほうがいいのでしょうか?_month
?
どのように解決するのですか?
-
常に
[[self class] allocWithZone:zone]
を使用して、適切なクラスを使用してコピーを作成していることを確認する必要があります。002 の例は、まさにその理由を示しています。サブクラスは[super copyWithZone:zone]
を呼び出し、スーパークラスのインスタンスではなく、適切なクラスのインスタンスを取得することを期待します。 -
私は直接ivarsにアクセスするので、後でプロパティセッターに追加するかもしれないどんな副作用(例えば、通知を生成すること)についても心配する必要はありません。サブクラスは、どのメソッドも自由にオーバーライドできることに留意してください。あなたの例では、1つのivarにつき2つのメッセージを追加で送信しています。私なら次のように実装します。
コードです。
- (id)copyWithZone:(NSZone *)zone {
Crime *newCrime = [super copyWithZone:zone];
newCrime->_month = [_month copyWithZone:zone];
newCrime->_category = [_category copyWithZone:zone];
// etc...
return newCrime;
}
もちろん、ivarをコピーするか、保持するか、あるいは単に代入するかは、セッターが行うことを反映する必要があります。
関連
-
[解決済み] キーボードがあるときに、UITextFieldを編集開始時に上に移動させるには?
-
[解決済み] UILongPressGestureRecognizerが押し下げ時に2回呼び出される
-
[解決済み】@try - Objective-Cのcatchブロック
-
[解決済み] APNSの.pemファイルを作成する?
-
[解決済み] iPhone Safari ウェブアプリでリンクを新しいウィンドウで開く
-
[解決済み] Push Notificationのアラートテキストは何文字まで可能ですか?
-
[解決済み] iPhone UIViewアニメーションのベストプラクティス
-
[解決済み] NSLocalizedStringを使用したベストプラクティス
-
[解決済み] iPhoneシミュレーターでカメラをテストするには?
-
[解決済み] 現在のメソッド呼び出しのスレッド ID を取得する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Cocoapodsの使用時にXcodeの警告を無視する
-
[解決済み] UINavigationControllerに右ボタンを追加する方法は?
-
[解決済み] APNSの.pemファイルを作成する?
-
[解決済み] iPhone Safari ウェブアプリでリンクを新しいウィンドウで開く
-
[解決済み] UITableViewHeaderFooterView。背景色を変更できない
-
[解決済み] UIImageのアスペクト比と幅を維持したリサイズ
-
[解決済み] モバイルアプリにおけるOAuthの秘密
-
[解決済み] Mac OS Xのスタティック・ライブラリ(.a)のターゲット・アーキテクチャはどのように決定するのですか?
-
[解決済み] アプリを提出する前にitunesのリンクを取得する
-
[解決済み] iPhoneシミュレーターの位置情報