Tôi đã tìm thấy mẫu đơn trên mạng. Dường như với tôi nó có nhiều thứ có thể được tối ưu hóa.Mục tiêu-C - Tối ưu hóa mẫu đơn này?
-In sharedMySingleton
phương pháp, không cần phải giữ lại? Tôi không chắc chắn ...
-Nếu không, tại sao lại giữ lại trong allocWithZone
?
-khi sử dụng @synchronized
. NSAssert nghĩ rằng khối có thể được gọi nhiều lần, vì vậy nếu có, sẽ có thêm một số mã để giải phóng bộ nhớ trước đó, hoặc thoát khỏi khối rõ ràng mà không cần NSAsserting, và nếu không, tại sao lại có NSAssert này?
-giây xích giữa sharedMySingleton
và alloc
có vẻ lạ. Tôi muốn viết bản thân mình một cái gì đó như:
+(MySingleton*)sharedMySingleton
{
@synchronized([MySingleton class])
{
if (_sharedMySingleton == nil) _sharedMySingleton = [[self alloc] init];
return _sharedMySingleton;
}
return nil;
}
+(id)alloc
{
@synchronized([MySingleton class])
{
return [super alloc];
}
return nil;
}
Singleton pattern
#import "MySingleton.h"
@implementation MySingleton
// ##########################################################################################################
// ######################################## SINGLETON PART ##################################################
// ##########################################################################################################
static MySingleton* _sharedMySingleton = nil;
// =================================================================================================
+(MySingleton*)sharedMySingleton
// =================================================================================================
{
@synchronized([MySingleton class])
{
if (_sharedMySingleton == nil) [[self alloc] init];
return _sharedMySingleton;
}
return nil;
}
// =================================================================================================
+(id)alloc
// =================================================================================================
{
@synchronized([MySingleton class])
{
NSAssert(_sharedMySingleton == nil, @"Attempted to allocate a second instance of a singleton.");
_sharedMySingleton = [super alloc];
return _sharedMySingleton;
}
return nil;
}
+ (id)allocWithZone:(NSZone *)zone { return [[self sharedMySingleton] retain]; }
- (id)copyWithZone:(NSZone *)zone { return self; }
- (id)retain { return self; }
- (NSUInteger)retainCount { return NSUIntegerMax; /* denotes an object that cannot be released */}
- (oneway void)release { /* do nothing */ }
- (id)autorelease { return self; }
// ##########################################################################################################
// ##########################################################################################################
// ##########################################################################################################
// =================================================================================================
-(id)init
// =================================================================================================
{
if (!(self = [super init])) return nil;
return self;
}
// =================================================================================================
-(void) dealloc
// =================================================================================================
{
[super dealloc];
}
// =================================================================================================
-(void)test
// =================================================================================================
{
NSLog(@"Hello World!");
}
@end
Còn các phương pháp khác: giữ lại, giữ lại, phát hành, copyWithZone, ...? Tại sao bạn lại nói về các phiên bản "hiện đại"? Bạn có ý nghĩa gì bởi hiện đại? Bất kỳ ý tưởng nào về việc tại sao Apple không cập nhật đoạn mã đơn lẻ của mình bằng loại mã này? – Oliver
Bởi hiện đại, tôi có nghĩa là kể từ khi giới thiệu của GCD. Bạn không nên ghi đè lên các phương pháp này. Mã mẫu duy nhất cho thấy ghi đè những điều này là ở đây: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/CocoaObjects.html Vì nó lưu ý, đây là triển khai * nghiêm ngặt * của singleton, mà văn bản ở trên giải thích nói chung là không cần thiết. Tôi đã mở một trường hợp tài liệu để cải thiện tài liệu này vì nó bị nhầm lẫn rất nhiều nhà phát triển. Mike Ash có một bài đăng hay về điều này: http://www.mikeash.com/pyblog/friday-qa-2009-10-02-care-and-feeding-of-singletons.html –
Tương đương với 10,6 trong điều khoản của iOS? – Oliver