問題タブ [declared-property]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
delegates - Xcode iPhone SDK (5.x) - AppDelegate 内の NSString へのアクセス
内にあるNSString
fromにアクセスしたい。AppDelegate.m
ViewController.m
私はSingle View Applicationを持っNSString
ています。applicationDidEnterBackground:
AppDelegate.m
はNSString
内ViewController.m
にあり、 では宣言されていませんAppDelegate.m
。
私はそれを宣言してからAppDelegate.h
アクセスしようとしましたViewController.m
(そして逆に)。
ViewController.h
:
AppDelegate.m
:
objective-c - プロパティをオーバーライドするパターンはありますか?
Objective-C ランタイムは、宣言されたプロパティのリストを Class オブジェクトのメタデータとして保持します。メタデータには、プロパティ名、タイプ、および属性が含まれます。ランタイム ライブラリには、これらの情報を取得するための関数もいくつか用意されています。これは、宣言されたプロパティがアクセサー メソッド (getter/setter) のペア以上のものであることを意味します。私の最初の質問は、なぜ私たち (またはランタイム) がメタデータを必要とするのですか?
よく知られているように、宣言されたプロパティはサブクラスでオーバーライドできません (readwrite と readonly を除く)。しかし、私はそれが必要であることを保証するシナリオを持っています:
もちろん、コンパイラは上記のコードを通過させません。私の解決策は、宣言されたプロパティをアクセサー メソッドのペアに置き換えることです (読み取り専用の場合はゲッターのみ)。
プロパティstring
は段階的に変更され、頻繁に変更される可能性があるため、変更可能である必要があります。同じセレクターを持つメソッドは同じ戻り値とパラメーターの型を共有する必要があるという制約を知っています。しかし、上記の解決策は意味的にも技術的にも適切だと思います。セマンティックな側面では、可変オブジェクトは不変オブジェクトです。技術的な面では、コンパイラはすべてのオブジェクトをidとしてエンコードします。私の2番目の質問は、上記の解決策は理にかなっていますか? それとも単に奇妙ですか?
次のように、ハイブリッド アプローチを採用することもできます。
ただし、 のようなドット構文を使用してプロパティにアクセスするmyMutableObject.string
と、コンパイラは、アクセサ メソッドの戻り値の型が宣言されたプロパティの型と一致しないことを警告します。メッセージフォームとしてご利用いただいても構いません[myMutableObject string]
。これは、宣言されたプロパティがアクセサー メソッドのペア以上のものであるという別の側面を示唆しています。つまり、ここでは望ましくありませんが、より静的な型チェックです。3 番目の質問は、サブクラスでオーバーライドする場合、宣言されたプロパティの代わりに getter/setter ペアを使用するのが一般的ですか?
objective-c - ARCのNSStringプロパティは強力である必要がありますか、それともコピーする必要がありますか?
ARCでコンパイルしない場合は、copy
などのデータ型のプロパティを使用することをお勧めしますNSString
。copy
ARCモードでの使用に関する適切なドキュメントが見つかりませんでした。誰かがARCに何が適用できるか教えてもらえますか?
objective-c - ウィーク ポインターを介したブロック内の ivar への代入
isFinished
インターフェイス ファイルに読み取り専用のプロパティがあります。
YES
そして、保持サイクルを作成せずに、後である時点でブロックに設定したいself
:
これが正しい方法かどうかはわかりません。このコードは漏れたり壊れたりしますか? それとも問題ありませんか? おそらく私が見落としていたより簡単な方法がありますか?
objective-c - プロパティにストロングまたはウィークを使用する場合
としてテーブル ビューがありIBOutlet
、デフォルトで XCode はそのプロパティをstrong
ではなくに設定しますweak
。「受信メモリ警告」メッセージが表示されることがあります。そこで、多くのプロパティを から に変更しようとしましstrong
たweak
が、プロセスに影響はないようで、スムーズに動作します。コンセントを弱く設定する必要がありますか、それとも間違っていますか?
そして最も重要なことは、メソッドですべてのプロパティを設定する必要があるか、それともs のみを設定する必要があるかです。nil
viewDidUnload
IBOutlet
objective-c - 合成されたコードを保持しながら、合成されたゲッター/セッターにコードを追加する方法
たとえば、NSLog(@"Executed.")
合成されたゲッターまたはセッターが呼び出されるたびに実行する必要があります。それを行うには2つの方法があります。
- おそらく合成されたもののように機能するスニペットをいくつか見つけてください。このスレッドはその助けになるかもしれません。
- KVOを使用する:作業を行うオブザーバーを追加します。
それらのすべては私にとって満足のいくきれいに見えません。だから、subj。
UPDAE:回答ありがとうございますが、直接オーバーライドすることは解決策ではありません。合成されたコードを失います。どこかから(アップルエンジニアがコードを提供するアップルフォーラムからでも)合成されたコードを「コピーアンドペースト」「正しく」する場合は、次のコンパイラリリース後に変更されていないことを確認する必要があります。
objective-c - Apple LLVM 4.0 の新しい「デフォルト合成」機能はどのように動作しますか?
Xcode 4.4 のリリース ノートを読んでいて、次のことに気付きました。
LLVM 4.0 コンパイラ
Xcode には、次の新しい Objective-C 言語機能を含む、Apple LLVM コンパイラ バージョン 4.0 が含まれるようになりました。
- デフォルトの @synthesize: 実装されていない場合、@property を自動的に合成します
この機能に興味があります。それはどのように機能しますか?を削除してみましたが@synthesize
、うまくいきません。
objective-c - コピーされた NSMutableString プロパティを使用しようとすると例外が発生する
プロパティがまたはNSMutableString
であるべきかどうかを調査するために、小さな Xcode プロジェクトを開始しました。私は自分のプロパティを属性で宣言しました:copy
retain
copy
次に、次のように初期化しましたself.stringA = [NSMutableString new];
最後に文字列を設定しようとしました[stringA setString:@"A"];
。
ただし、プログラムは、
「キャッチされない例外 'NSInvalidArgumentException' が原因でアプリを終了しています。理由: 'setString で不変オブジェクトを変更しようとしています:'」
NSString
結果の文字列が これは、属性NSMutableString
を使用してプロパティを宣言し、を使用してプロパティを宣言する必要があるということですか?retain
NSString
copy
objective-c - ivarsスコープについての簡単な問い合わせ
重複の可能性:
@syntheized インスタンス変数の可視性は?
これらの ivarのスコープ ( @private
、など) は何ですか?@protected
-@property/@synthesize
-宣言された.h
-宣言された.m
objective-c - セッターが一方のプロパティに対して呼び出され、もう一方のプロパティに対して呼び出されないのはなぜですか?
このコードは Big Nerd Ranch iOS Programming book から引用しました。コードでは、2 つのインスタンス変数coordinate
とtitle
. なぜcoordinate
直接割り当てられtitle
、セッターを呼び出すことによって設定されるのですか?
ヘッダー ファイル
実装ファイル