質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

NSString

NSStringはCocoaとCocoa Touchにおける、Objective-Cで文字列を扱う為のクラスです。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

1913閲覧

NSString *hoge = [(NSString *)fuga retain]のARC対応はどうすればよい?

Mesh

総合スコア14

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

NSString

NSStringはCocoaとCocoa Touchにおける、Objective-Cで文字列を扱う為のクラスです。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2016/04/18 00:05

編集2016/04/18 04:05

あるソース・ファイルをARC対応する際に困っています。

NSStringのインスタンス変数hogeが宣言されています。

Objective

1@interface SampleClass : NSObject{ 2 NSString hoge; 3} 4 5hoge = [(NSString *)fuga retain];

という形で代入され使われている行がありました。
ARCに対応するには単純にretainを外して、このようにしてしまって良いのでしょうか?

Objective

1hoge = (NSString *)fuga; 2

hogeが勝手に開放されないか不安です。
また外部クラスからhogeをアクセスすることはないようなので、プロパティにするのもおかしいのかなと思っていますがどうなのでしょうか?

追記:
具体的なソース(GDataXMLNode)を追記します。
hogeに当たるのがcachedName_で、ヘッダーファイル内で宣言されています。

Objective

1- (NSString *)qualifiedName { 2 // internal utility 3 4 NSString *str = nil; 5 6 if (xmlNode_ != NULL) { 7 if (xmlNode_->type == XML_NAMESPACE_DECL) { 8 9 // name of a namespace node 10 xmlNsPtr nsNode = (xmlNsPtr)xmlNode_; 11 12 // null is the default namespace; one is the loneliest number 13 if (nsNode->prefix == NULL) { 14 str = @""; 15 } 16 else { 17 str = [self stringFromXMLString:(nsNode->prefix)]; 18 } 19 20 } else if (xmlNode_->ns != NULL && xmlNode_->ns->prefix != NULL) { 21 22 // name of a non-namespace node 23 24 // has a prefix 25 char *qname; 26 if (asprintf(&qname, "%s:%s", (const char *)xmlNode_->ns->prefix, 27 xmlNode_->name) != -1) { 28 str = [self stringFromXMLString:(const xmlChar *)qname]; 29 free(qname); 30 } 31 } else { 32 // lacks a prefix 33 str = [self stringFromXMLString:(xmlNode_->name)]; 34 } 35 } 36 37 return str; 38} 39 40- (NSString *)name { 41 42 if (cachedName_ != nil) { 43 return cachedName_; 44 } 45 46 NSString *str = [self qualifiedName]; 47 48 cachedName_ = str; 49 50 return str; 51}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pebble8888

2016/04/18 01:03

fuga変数の宣言、生成処理をしているコードを追記して下さい。
Mesh

2016/04/18 04:06

具体的な生成処理内容を追記させて頂きました。
guest

回答2

0

fugaはNSString型のようなので、Stripeさんの回答どおりretainをはずすだけでよいです。

ARC化はこの辺が参考になります。

https://developer.apple.com/library/mac/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

投稿2016/04/18 05:28

pebble8888

総合スコア390

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Mesh

2016/04/18 08:01

なるほど、ありがとうございます! URLまでご丁寧にありがとう御座いました。参考にさせていただきます。
guest

0

ベストアンサー

単純にretainを消すだけで良いです。
意図的にhoge = nil;と書かない限り解放されません。
外部からアクセスさせないようにするなら、hogeの宣言をヘッダーファイルから排除してください。

投稿2016/04/18 03:32

Stripe

総合スコア2183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Mesh

2016/04/18 04:08

なるほど、そういうものなのですね! となると、fugaがnilにった場合はhogeも同時に開放されてしまうということでしょうか?
Stripe

2016/04/18 12:23

全ての変数から参照されなくなると解放されます。 fugaがnilになっても、hogeで参照しているなら解放されません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問