-1

私はRayWenderlichサイトのチュートリアルに従っており、同じ名前で書き込み可能なnsarray読み取り専用配列とnsmutableble配列があるこのコードを理解しようとしています。また、_(アンダースコア)プロパティを使用する理由とプロパティを設定してself.xを使用する理由は何ですか?コードは次のとおりです:これはサイトからのものです

MatchmakingServer.h

@interface MatchmakingServer : NSObject <GKSessionDelegate>

@property (nonatomic, assign) int maxClients;
@property (nonatomic, strong, readonly) NSArray *connectedClients;
@property (nonatomic, strong, readonly) GKSession *session;

- (void)startAcceptingConnectionsForSessionID:(NSString *)sessionID;

@end

MatchmakingServer.m

#import "MatchmakingServer.h"

@implementation MatchmakingServer
{
    NSMutableArray *_connectedClients;
}

@synthesize maxClients = _maxClients;
@synthesize session = _session;

- (void)startAcceptingConnectionsForSessionID:(NSString *)sessionID
{
    _connectedClients = [NSMutableArray arrayWithCapacity:self.maxClients];

    _session = [[GKSession alloc] initWithSessionID:sessionID displayName:nil sessionMode:GKSessionModeServer];
    _session.delegate = self;
    _session.available = YES;
}

私は代わりにこのようなことをしています

matchmakingserver.h

@interface zvMatchMakingServer : NSObject <GKSessionDelegate>

@property (nonatomic, assign) int maxClients;
@property (nonatomic, strong, readonly) NSArray *connectedClients;
@property (nonatomic, strong, readonly) GKSession *session;

- (void)startAcceptingConnectionsForSessionID:(NSString *)sessionID;


@end

matchmakingserver.m

@interface zvMatchMakingServer()

@property (nonatomic,strong) NSMutableArray *connectedClients;
@property (nonatomic, strong) GKSession *session;

@end

@implementation zvMatchMakingServer


-(NSArray *)connectedClients
{
    return self.connectedClients;
}

-(void)startAcceptingConnectionsForSessionID:(NSString *)sessionID
{
    self.connectedClients = [[NSMutableArray alloc]initWithCapacity:self.maxClients];
    self.session = [[GKSession alloc]initWithSessionID:sessionID displayName:nil sessionMode:GKSessionModeServer];

}

私がやっていることは基本的に同じことです、さもないとうまくいきません。ありがとうございました!

4

1 に答える 1

1

Rayのコードで何が起こるかを説明しようと思います。

彼はプロパティを宣言します:

@property (nonatomic, strong, readonly) NSArray *connectedClients;

(iOS 6ではAppleがプロパティがiVarを生成する方法を変更したため、これはiOS 6より前のものだったと思います。)

このプロパティにより、コンパイラは自動的にiVarを生成しますNSArray *connectedClients。このiVarはコードでは使用されていません。_connectedClients代わりに、彼はタイプが名前の新しい(プライベート)iVarを宣言していNSMutableArrayます。彼はプロパティのアクセサーを合成しないことに注意してください。彼はアクセサを自分で作成し、プロパティ(connectedClients)によって生成されたiVarを返す代わりに、自分の「自分の」iVar(_connectedClients)を返します。

- (NSArray *)connectedClients
{
    return _connectedClients;
}

NSMutableArrayのサブクラスなのでNSArray、問題ありません。

あなたがしていることは、プロパティ@property (nonatomic,strong) NSMutableArray *connectedClients;をプライベートプロパティとして再宣言しようとしていることであり、それは許可されていません。コードをレイのコードと注意深く比較すると、違いがわかります。

アンダースコアについて:

これは、多くの人がiVarに名前を付けるために使用する規則にすぎません。意味的な意味はありません。実際、Appleは「自動生成された」iVarの名前をアンダースコアも使用するように変更しました。

iOS6以前のプロパティ

@property (...) SomeClass *name;

。という名前のiVarを生成しましたname。iOS 6では、同じプロパティが。という名前のiVarを生成します_name。また、iOS 6では、行を追加する必要はあり@synthesizeません。

iVarsの名前の前にアンダースコアを付けると便利でした。これは、自動生成されたアクセサーをオーバーライドする場合、オートコンプリートが次のことを示唆しているためです。

- (void)setName:(SomeClass *)name

iVarにも名前が付けられている場合name、パラメーターnameはアクセサー実装でiVarを非表示にするため、パラメーターの名前を変更する必要がありました。@synthesize name = _nameパラメーターを使用してiVarの名前を変更した場合、パラメーターnameは非表示にならず、アクセサー用にオートコンプリートで生成されたコードを使用できます。

- (void)setName:(SomeClass *)name
{
    //maybe release the old value and retain the new one if you're not using ARC and weather it's a retained property or not. 
   _name = name;
}
于 2012-10-28T17:39:45.500 に答える