2014年10月21日火曜日

Mac mini 2014の問題;BootCampは解決

Mac mini 2014を購入した。
壊れたMac mini 2011の代わりである。
で、いきなり色々と書いておかねばならないことがある。

(1)メモリーはユーザーで増設できない
もはや裏蓋すら開けることができない。
後で増設しようと思って8GBモデルにしたけど、こんな仕打ちとは。

(2)完全初期設定には有線マウスが必須
Bluetoothでも行けそうな画面が出てくるが、全く認識してくれなかったので有線マウスを使った。2回目以降ではBluetoothマウスが使える。なぜ?

(3)コネクタ間が狭くなっているので、接続できないことがある。特にHDMIとThunderboltの間が狭くなったため、干渉しやすい。HPの写真で見る限りmini2011と変わらないようだけど、実際にはぶつかってしまう。たぶん1ミリ以下だが狭くなったのだと思う。うちでは今まで使えてたHDMIケーブルがぶつかってしまい奥まで刺さらない。一応表示はできているけど。

(4)FireWire端子はない
うちにはFireWire接続のHDDがあるためこの端子は必須で、Apple純正のThunderboltーFireWire変換ケーブルを買った。税込みで3000円ちょっと。これは予めわかっていたので買ってあった。このケーブル経由でのアクセスはMacでは全く問題ない。Windowsでは即認識されない。一旦再起動する必要がある(MacOS側で一度認識させるといいのかも)。

(5)初期設定は全て英語
全く困ったことに、初期設定の画面は全て英語である。それを翻訳しながらの作業になるので時間がかかった。TimeMachineからの戻しができるのでMacは移行が楽なのではあるけど。最初の選択画面で英語が選ばれていた模様。キーボードが効かなかったので適当に押していた時にそうなったか。キーボードを効かすにはスペースを押す。

(6)内蔵スピーカーからの音が割れる
物理的に共振している感じ。2011ではこんなことはなかった。
→起動音だけな感じ。

(7)BootCampでの注意
BootCampによるWindows7の導入時、USBに刺しておくメモリは、2014Yosemite上のBootCampで作ったWindowsのisoイメージ+αを入れたメモリだけにしなければならない。2011で作ったものは使えない。別のUSBメモリにドライバーを入れることもできるが、それはWindowsインストール中は刺していてはいけない。指していると、インストールの途中でエラーが発生しWindowsの導入に失敗する。
Windowsマシンでの導入失敗例を調べているうちに、「HDDを内蔵の他に接続していると失敗する」という症例を見つけ、まさかと思ってドライバの入ったUSBメモリを外したら行けた。しかし、Mac mini2011ではいけた気がしたのだが、それは起動できるUSBポートが1だけだという仕様だったからだろうか。いずれにせよ騒ぎ過ぎた。すまん。

なお、Bluetoothマウスを使っている場合、MacOS側とWindows側で別にペアリングを行う必要がある。その間は他方でマウスが使えないので有線マウスが必要となる。いろんな意味で、Macには有線マウスが必須。

(8)Thunderboltにディスプレイ以外の機器を繋いでいるとWindowsではスリープが使えなくなる
うちでは前述の通り変換ケーブルでFirewireのHDDを繋いでいるが、そうするとWindowsでスリープが使えない(休止は使える)。アップルの公式見解だから間違いない。変換ケーブルでDVIに繋いだモニタはたぶん大丈夫。それは2011でも繋いでたから。
問題は、Mac miniの電源ボタンが背面にあることで、休止にせよシャットダウンにせよ電源ボタンを押す必要があるから、今迄みたいにモニタの後ろに本体を置いておくと言うことが出来なくなった。


ということで、安いなりに手抜き、というか割り切った仕様の部分があるので要注意である。

・・・実際のところ性能はどうなのか・・・
で、mini2011と比較して2014はどうなのかについても軽く書いておく。

・静か
高負荷時でもファンの音が聞こえない。
筐体温度も低めな気がする。

・速くなったとは感じない
速度はCPUにせよGPUにせよ速くなったとは感じない。
エクスペリエンスインデックスではCPUが7.2、グラフィックが6.7と良い数値を出しているが、Windowsとしての動作は差を感じない。もっとも、2011では16GB積んでいたのが今回は8GBなので、その差を考えればやはり若干は速いのかもしれない。

という感じ。少なくとも、わざわざ2011から買い換える必要はないかと。

2014年10月2日木曜日

UITableViewCellの再利用について

UITableViewでは、画面内の表示に必要な分だけ、登録したセル(UITableViewCell)がシステム内部に用意される。
あくまで表示分だけであって、全体ではない。スクロールで表示外に出たセルは新しく入ってくる表示分に再利用される

表示外に出たセル→→→+
----------                 |
表示内                     |
                          |再利用
                          |
                          |
----------                 |
表示内に入るセル←←←+|
(実際には表示街に出たセルがすぐ入ってくるセルになるわけではない。
逆スクロールを考慮してか、若干の猶予がある。)

再利用されるとき、セル内に配置されたラベルなどの内容は「そのまま」なので、新しい表示を作るには、
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
で設定する必要がある。

「そのまま」なのは.textだけでなく.hiddenや.frame、addSubviewしている場合はそれもなので、
それらを変更した場合には、元に戻す必要がある。

カスタムセルの場合、awakeFromNibはセルの新規作成時のみ呼び出されるので、
この中で、変化する要素の変化前の情報を保存しておき、
cellForRowAtIndexPath内でまずそれに戻し、その後、新しい表示を設定する。

全体の手順

UITableViewCellの子クラス

@interface NewCell()
{
    CGRect frame;
}

- (void)awakeFromNib
{
    printSelf();
    [super awakeFromNib];
    //変更される要素の属性保存
    //「例」
    frame=label.frame;
}

-(void)initialize
{
    printSelf();
    label.frame=frame;
    // 追加されたボタンを削除する
    for (UIView *vw in self.subviews) {
        if (vw.tag==TAG_ADD_BUTTON) {
            [vw removeFromSuperview];
        }
    }
}

要素を追加するときは、.tagにTAG_ADD_BUTTONを入れて、後で識別できるようにするといい。




どうやってもセルに不必要な表示が残るのでわかったことであった。